Goetz's Java Concurrency in Practice, trang 41, đề cập đến cách tham chiếu this
có thể thoát trong khi xây dựng. A "không làm điều này" dụ:"Đối tượng được xây dựng không hoàn toàn" là gì?
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
Đây this
được "thoát" qua thực tế là doSomething(e)
đề cập đến kèm theo ThisEscape
dụ. Tình hình có thể được cố định bằng cách sử dụng phương pháp nhà máy tĩnh (đầu tiên xây dựng đối tượng đồng bằng, sau đó đăng ký người nghe) thay vì các nhà xây dựng công cộng (làm tất cả công việc). Cuốn sách tiếp tục:
Xuất bản đối tượng từ bên trong hàm tạo của nó có thể xuất bản đối tượng được xây dựng không đầy đủ. Điều này đúng ngay cả khi ấn phẩm là câu lệnh cuối cùng trong hàm tạo. Nếu thoát khỏi tài liệu tham khảo
this
trong khi xây dựng, đối tượng được coi là không được xây dựng đúng cách.
Tôi không hiểu rõ điều này. Nếu ấn phẩm là câu lệnh cuối cùng trong hàm tạo, thì không phải tất cả công việc xây dựng đã được thực hiện trước đó chưa? Làm thế nào đến là this
không hợp lệ sau đó? Rõ ràng có một số voodoo xảy ra sau đó, nhưng những gì?
Ồ, thật đáng ngạc nhiên là các trường 'final', thường được coi là đồng thời thân thiện, là thủ phạm trong trường hợp này! –
@Joonas: Đó là chà - chúng đồng thời thân thiện * nếu bạn đảm bảo tham chiếu không thoát khỏi hàm tạo *. Trong hầu hết các trường hợp, đó là một mức giá khá nhỏ để trả. –
Thực tế, điều này áp dụng cho bất kỳ trường nào, không áp dụng cho các trường cuối cùng. –