5

Stack Overflow 上有一个关于为什么在构造函数中启动线程不是一个好主意的问题。我意识到这种事情的结果将是“this”可以逃脱。我还读到,出于同样的原因,从构造函数发布 EventListener也是一个坏主意。我应该注意哪些其他模式可以让“this”逃脱?

4

1 回答 1

4

从构造函数调用对象的任何实例方法都会泄漏this到该方法。只要该方法在您的控制之下(不可公开覆盖),这可能没问题,并且您确保不会this进一步泄漏。使用this作为任何方法的参数当然是更明确的变体,当你说x.addEventListener(this). 一种可能更阴险的,因为不太明显,泄漏 a 的方法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嵌套类,它将没有封闭的实例。

于 2012-06-30T13:52:25.400 回答