Tôi biết rằng mã này:Java đôi khởi tạo công trình luôn luôn?
Set<String> set = new HashSet<String>() {{
add("test1");
add("test2");
}};
thực sự là:
Set<String> set = new HashSet<String>() {
{//initializer
add("test1");
add("test2");
}
};
Khối initializer đang được thực hiện trước khi khối nhà xây dựng. Trong ví dụ trên, thêm ("test1") được gọi trước khi hàm tạo đang được thi hành. Hàm khởi tạo có thể khởi tạo nhiều trường thể hiện để lớp này hoạt động. Tôi tự hỏi tại sao gọi .add() trước khi hàm tạo sẽ hoạt động? Có trường hợp nào gây ra vấn đề không?
Điều này có thể sẽ rơi vào 'hành vi không xác định' ... – 11684
Câu hỏi thú vị. Tôi không thực sự có một câu trả lời nhưng tôi nghĩ rằng bạn đang làm một giả định không chính xác ở đây. Nếu bạn nhìn vào hàm tạo của HashSet nó thực hiện điều này: 'map = new HashMap();' và phương thức add thực hiện điều này: 'return map.put (e, PRESENT) == null;'. Nếu giả định của bạn là chính xác, điều này sẽ gây ra một NPE. –
[Chắc chắn không phải là sai khi nghĩ về việc liệu "mẫu" này thực sự đáng giá hay không] (http://stackoverflow.com/q/924285/521799) –