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

时间:2012-06-30 13:40:44

标签: java synchronization this

关于为什么starting a thread inside the constructor is not a good idea ,Stack Overflow上有一个问题。我意识到这样的事情的结果将是'这个'可以逃脱。我也读到publishing a EventListener from constructor也是一个坏主意,出于同样的原因。我应该注意哪些“这个”可以逃脱的其他模式?

1 个答案:

答案 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嵌套类,则会有一个封闭的实例。