【问题标题】:What are the various ways by which the 'this' can escape in Java?在 Java 中,“this”可以通过哪些方式逃脱?
【发布时间】:2012-07-01 17:39:54
【问题描述】:

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

【问题讨论】:

  • 一个关键的区别是'this'在被允许完全构造之前以部分状态转义。

标签: java synchronization this


【解决方案1】:

从构造函数调用对象的任何实例方法会将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
  }
}

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

【讨论】:

  • 所以我可以假设只要将“this”作为参数传递给外星方法,“this”就会泄漏(对于“Foo”类,外星方法是它无法控制的方法,并且它可能意味着其他类的方法或 C 本身的非私有/可覆盖方法)?
  • 我明白了我在第一句话中的意思不够清楚。我的意思是“this 对象的任何实例方法”(正在执行其构造函数的方法)。至于外来方法,它们的访问级别并不重要。重要的是您是否将 this 传递给这样的方法——通过内部类实例显式或隐式传递。
猜你喜欢
  • 2020-11-02
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2016-06-21
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
相关资源
最近更新 更多