2012-06-30 16 views
5

Có một câu hỏi về Stack Overflow về lý do tại sao starting a thread inside the constructor is not a good idea. Tôi nhận ra rằng kết quả của một điều như vậy sẽ là 'điều này' có thể trốn thoát. Tôi cũng đọc rằng publishing a EventListener from constructor cũng là một ý tưởng tồi vì lý do tương tự. Các mẫu khác mà tôi nên biết là 'cái này' có thể thoát ra sao?Các cách khác nhau mà theo đó 'điều này' có thể thoát ra trong Java như thế nào?

+1

Sự khác biệt chính là 'điều này' thoát trong trạng thái từng phần trước khi được phép xây dựng hoàn toàn. – phatfingers

Trả lời

4

Gọi bất kỳ phương pháp thể hiện nào của đối tượng của bạn từ công cụ xây dựng rò rỉ this với toán học đó. Điều này có thể được chấp nhận miễn là phương pháp đó nằm dưới sự kiểm soát của bạn (không được công khai overridable), và bạn đang đảm bảo rằng bạn không bị rò rỉ thêm this từ nó. Sử dụng this làm đối số cho bất kỳ phương pháp nào, tất nhiên là biến thể rõ ràng hơn và điều đó xảy ra khi bạn nói x.addEventListener(this). Một lẽ insdidious hơn, vì ít rõ ràng, cách để rò rỉ một this là không sử dụng this chính nó như là một cuộc tranh cãi, nhưng một thể hiện của một địa phương lớp// vô danh bên trong, nói

public class Main 
{ 
    private class MyListener extends MouseAdapter { ...} 

    public Main() { 
    class Listener1 extends MouseAdapter { ... } 
    someSwingComponent.addMouseListener(new MyListener()); // inner class 
    someSwingComponent.addMouseListener(new Listener1()); // local class 
    someSwingComponent.addFocusListener(new FocusAdapter() { ... }); // anonymous 
    } 
} 

Trong tất cả những trường hợp này this sẽ là thể hiện kèm theo của đối tượng được truyền dưới dạng đối số phương thức. Mặt khác, nếu bạn khai báo một lớp lồng nhau static, nó sẽ không có một cá thể kèm theo.

+0

Vì vậy, tôi có thể giả định rằng 'điều này' có thể bị rò rỉ bất cứ khi nào 'điều này' được thông qua như một đối số cho một phương pháp ngoài hành tinh (To a Class 'Foo' một phương pháp ngoài hành tinh là những phương pháp mà nó không kiểm soát được và nó có thể là phương pháp của các lớp khác hoặc các phương thức không riêng tư/có thể ghi đè của chính C)? – Inquisitive

+0

Tôi thấy tôi đã không làm cho điểm của tôi đủ rõ ràng trong câu đầu tiên. Tôi có nghĩa là "bất kỳ phương pháp dụ của' this' đối tượng "(một trong những người có constructor đang được thực hiện). Theo như phương pháp người nước ngoài, mức độ truy cập của họ không quan trọng. Điều quan trọng là liệu bạn có đang truyền 'this' đến một phương thức như vậy --- hoặc một cách rõ ràng hoặc ngầm định thông qua một cá thể lớp bên trong. –

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