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