使用';这';可以用Java逃逸吗?
关于堆栈溢出的原因有一个问题。我意识到这样一件事的结果是“这个”可以逃脱。我还读到,出于同样的原因,这也是一个坏主意。“this”可以转义的其他模式还有哪些?从构造函数调用对象的任何实例方法会将使用';这';可以用Java逃逸吗?,java,synchronization,this,Java,Synchronization,This,关于堆栈溢出的原因有一个问题。我意识到这样一件事的结果是“这个”可以逃脱。我还读到,出于同样的原因,这也是一个坏主意。“this”可以转义的其他模式还有哪些?从构造函数调用对象的任何实例方法会将this泄漏到该方法。只要该方法在您的控制下(不可公开重写),并且您确保不会进一步泄漏This,就可以了。使用this作为任何方法的参数当然是更明确的变体,当您说x.addEventListener(this)时就会发生这种情况。泄漏this的一种可能更危险、也不太明显的方法是不要将this本身用作参数,
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”在被允许完全构造之前以部分状态转义。因此,我是否可以假设只要将“this”作为参数传递给外部方法,“this”就会泄漏(对于类“Foo”,外来方法是指它无法控制的方法,它可以表示其他类的方法或C本身的非私有/可重写方法)?我发现我在第一句话中没有充分阐明我的观点。我指的是“此对象的任何实例方法”(其构造函数正在执行的对象)。对于外来方法,它们的访问级别并不重要。重要的是您是否通过内部类实例显式或隐式地将此
传递给此类方法。