Tại sao tôi nên sử dụng khối khởi tạo tĩnh khi tôi có thể khởi tạo các thành viên tĩnh thông qua một hàm tạo?Tại sao tôi nên sử dụng khối khởi tạo tĩnh trong java?
Trả lời
Thứ nhất, bạn có thể không bao giờ có bất kỳ phiên bản nào của lớp học. Hoặc bạn có thể muốn các thành viên tĩnh bị vô tình trước bạn có bất kỳ phiên bản nào của lớp.
Thứ hai, khởi tạo các thành viên tĩnh từ nhà xây dựng là nhiều việc:
- bạn sẽ cần phải chắc chắn rằng tất cả các nhà xây dựng thực hiện điều này;
- bạn cần duy trì cờ để theo dõi xem liệu các thành viên tĩnh đã được khởi tạo hay chưa;
- bạn phải suy nghĩ về đồng bộ hóa để ngăn chặn điều kiện chủng tộc;
- bạn có thể phải xem xét ý nghĩa hiệu suất của việc đồng bộ hóa, đặc biệt nếu bạn có nhiều chủ đề tạo nhiều phiên bản của lớp học.
Cuối cùng, thường là điều sai khi thực hiện khái niệm (Tôi nói "thường" vì có sử dụng hợp pháp để khởi tạo lười).
+1 - mặc dù nếu bạn định thực hiện khởi tạo lười biếng (hoặc không lười biếng), có thể bạn sẽ không "làm cho nó xảy ra" trong một nhà xây dựng. –
Thành viên tĩnh không được liên kết với bất kỳ phiên bản nào của lớp, trong khi hàm tạo tạo một thể hiện. Bạn có thể sử dụng các thành viên tĩnh mà không có một cá thể duy nhất của lớp, chúng sẽ vẫn phải được khởi tạo. Trong trường hợp này một nhà xây dựng không thể thực hiện công việc.
Vậy tại sao:
static Set<String> digits = new HashSet<String>();
static {
Collections.add(digits, "unu", "du", "tri", "kvar", "kvin");
digits.add("ses");
digits.add("sep");
digits.add("ok");
}
nếu sau đây là có thể:
static Set<String> digits = new HashSet<String>() {{
Collections.add(this, "unu", "du", "tri", "kvar", "kvin");
add("ses");
add("sep");
add("ok");
}};
- Nó giới thiệu một lớp ẩn danh mới, một tập tin trong lọ; không quá tối ưu.
- Biểu mẫu thứ hai là trò chơi vui nhộn.
tại sao giới thiệu các lớp ẩn danh mới không tối ưu? nó sẽ bao giờ dẫn đến lỗi nạp lớp? hoặc là bạn chỉ nói rằng bạn không muốn sưng lên bình của bạn. –
@DavidT. Tôi không có gì không thích cho một trong hai dạng, nhưng so sánh cả hai: đầu tiên có sự xuất hiện dư thừa của 'chữ số' và thứ hai tạo ra một lớp bất kỳ (chi phí nhỏ) và có cú pháp gây hiểu lầm cho các nhà phát triển không phải java. Sự nguy hiểm thực sự sẽ là khi sử dụng một '{{...}}' không tĩnh trên một lớp Serializable: sau đó 'this' của lớp xung quanh cũng được serialized. Tôi đã gặp phải một 'X.this' là null sau khi tải lại của đối tượng chẳng hạn. –
Trên thực tế, tôi phát hiện ra một sự khác biệt -> trên Eclipse, nếu bạn gặp sự cố bên trong lớp Ẩn danh của bạn, Eclipse thậm chí không biết dự án nào trỏ đến đường sụp đổ (như, nói rằng bạn có một chuỗi các chủ đề và runnables) như các lớp ẩn danh) –
- 1. Tại sao nên sử dụng các khối tĩnh để khởi tạo trực tiếp các biến mẫu?
- 2. Tại sao tôi nên khởi tạo biến lớp tĩnh trong C++?
- 3. Trên các khối khởi tạo tĩnh và không tĩnh trong Java
- 4. Java: Khi nào khối khởi tạo tĩnh hữu ích?
- 5. Java - Các biến cuối cùng có thể được khởi tạo trong khối khởi tạo tĩnh không?
- 6. Tại sao khối khởi tạo tĩnh không chạy trong trường hợp đơn giản này?
- 7. (Tại sao) tôi nên sử dụng obfuscation?
- 8. Tại sao tôi nên sử dụng glBindAttribLocation?
- 9. Tại sao tôi nên sử dụng Socket.io?
- 10. Tại sao tôi nên sử dụng "const" trong khối catch của mình?
- 11. Trình khởi tạo tĩnh và phương thức tĩnh Trong Java
- 12. Tại sao tôi nên sử dụng 'áp dụng' trong Clojure?
- 13. Trình khởi chạy tĩnh chạy sau hàm tạo, tại sao?
- 14. Tại sao tôi nên sử dụng lệnh GO trong Sybase?
- 15. tại sao khối catch đưa ra lỗi với biến không được khởi tạo trong Java
- 16. Khi nào chúng ta nên sử dụng biến cuối cùng tĩnh chưa được khởi tạo?
- 17. Tại sao tôi không nên sử dụng System.out.println() trong android
- 18. Tại sao tôi không thể khởi tạo lĩnh vực tĩnh trong C++
- 19. Tại sao không nên sử dụng attach() trong R, và tôi nên sử dụng cái gì?
- 20. Tại sao tôi nên sử dụng std :: async?
- 21. Khi nào/Tại sao tôi nên sử dụng Multithread trong Java?
- 22. Trình tự khởi tạo biến tĩnh, Java
- 23. Tại sao mã trong khối tĩnh không thực thi?
- 24. Chế nhạo các khối tĩnh trong Java
- 25. EF4.1 POCO: Tại sao tôi nên sử dụng ICollection
- 26. có được khối khởi tạo tĩnh để chạy trong một java mà không cần nạp lớp
- 27. Java mã tĩnh khối
- 28. Tại sao tôi nên tạo Giao diện trong PHP?
- 29. Tại sao tôi nên sử dụng Spring Android?
- 30. Tại sao RelayCommands thường sử dụng khởi tạo lười biếng?
Nếu bạn _never_ có thể hiện của lớp đó - nhưng muốn sử dụng các chức năng tĩnh của nó, sử dụng các giá trị được khởi tạo bởi khối khởi tạo tĩnh? – ppeterka
và mỗi khi c'tor được gọi, giá trị tĩnh sẽ được đặt lại. xấu!! – Azodious