在Java中,'this'可以通过哪些方式逃脱?

Inq*_*ive 5 java synchronization this

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

Mar*_*nik 4

从构造函数调用对象的任何实例方法都会泄漏this到该方法。只要该方法在您的控制之下(不可公开重写),并且您确保不会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
  }
}
Run Code Online (Sandbox Code Playgroud)

在所有这些情况下,this都将作为方法参数传递对象的封闭实例。另一方面,如果您声明一个static嵌套类,它将没有封闭实例。