关于为什么starting a thread inside the constructor is not a good idea ,有一个关于Stack Overflow的问题.我意识到这样的事情的结果将是“这个”可以逃脱.我还读到publishing a EventListener from constructor也是一个坏主意,出于同样的原因.我应该注意哪些“这个”可以逃脱的其他模式?
最佳答案
从构造函数中调用对象的任何实例方法会将此泄漏到该mathod.只要该方法在您的控制之下(不是可公开覆盖的),这可能没问题,并且您确保不会从中进一步泄漏.使用this作为任何方法的参数当然是更明确的变体,当你说x.addEventListener(this)时会发生这种变化.泄露这个问题的一个或许更为隐蔽的,不那么明显的方法是不要将它本身用作参数,而是使用内部/本地/匿名类的实例,比如说
@H_404_15@ 原文链接:https://www.f2er.com/java/438121.htmlpublic 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
}
}
在所有这些情况下,这将是作为方法参数传递的对象的封闭实例.另一方面,如果声明一个静态嵌套类,它将不具有封闭实例.