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?
Trả lời
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.
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
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. –
- 1. Trong Git, các chi nhánh địa phương có thể theo dõi nhau - điều này hữu ích như thế nào?
- 2. Sự khác nhau giữa Class.this và điều này trong Java
- 3. Làm thế nào để tạo một UserControl mà bạn có thể thả các điều khiển khác trong đó?
- 4. Java out.println() làm thế nào điều này có thể?
- 5. Có thể thực hiện điều gì đó khi chương trình Java thoát đột ngột không?
- 6. Có điều gì đó giống như find_if trong Java không?
- 7. Các cách thoát khác nhau của quy trình trong C++
- 8. IIS nhận ra các phiên khác nhau trong .NET như thế nào?
- 9. Điều này có thể xảy ra như thế nào: OnPaint được xử lý trong khi ở WaitOne
- 10. Ai đó có thể Giải thích mã java này
- 11. Java có thể làm điều gì đó như thể loại trong Mục tiêu C không?
- 12. JPA hoặc JDBC, chúng khác nhau như thế nào?
- 13. Làm thế nào để thoát ra khỏi liều lồng nhau
- 14. Làm cách nào tôi có thể thực hiện điều gì đó như find_in_batches_by_sql trong Rails
- 15. Các điều kiện mà theo đó ai có thể sử dụng câu lệnh 'when' trong Perl 5?
- 16. www theo sau với các số khác nhau như www1, www2, www3, v.v. - đó là gì?
- 17. Làm cách nào để cấp các quyền khác nhau cho các lớp Java khác nhau?
- 18. Cách "này" thoát khỏi hàm tạo trong Java?
- 19. Điều này có thể bằng cách nào đó trong C#: if (a == b == c == d) {...}
- 20. Sự khác nhau giữa $ (this) và điều này trong jquery
- 21. Các mẫu regex này có khác nhau không?
- 22. Lỗi 5xx nào khác có thể xảy ra và cách tôi tìm/theo dõi chúng?
- 23. Có điều gì đó giống như Codecademy cho Java
- 24. Tại sao các đầu ra LINQ này lại khác nhau?
- 25. Cách xử lý các thực thể thuộc tính khác nhau cho các thực thể khác nhau
- 26. Các chú thích Java này hoạt động như thế nào?
- 27. Tôi có thể sử dụng mô-đun theo cách có điều kiện trong Perl như thế nào?
- 28. Sự khác nhau giữa các lớp RootViewController, AppDelegate và View Controller mà tôi có thể tạo ra là gì?
- 29. Titanium SDK hoạt động như thế nào trong các nền tảng khác nhau mà nó hỗ trợ (vào năm 2013)?
- 30. Làm thế nào tôi có thể thoát URL trong Java (tài liệu không rõ ràng)?
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