2013-03-06 38 views
5

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?

+8

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

+1

và mỗi khi c'tor được gọi, giá trị tĩnh sẽ được đặt lại. xấu!! – Azodious

Trả lời

3

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).

+0

+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. –

1

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.

0

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"); 
}}; 
  1. 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.
  2. Biểu mẫu thứ hai là trò chơi vui nhộn.
+0

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. –

+1

@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. –

+1

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) –

Các vấn đề liên quan