Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用';这';可以用Java逃逸吗?_Java_Synchronization_This - Fatal编程技术网

使用';这';可以用Java逃逸吗?

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