【发布时间】:2016-04-23 15:01:56
【问题描述】:
我正在阅读本书Java concurrency in practice,在第 3.2 节中,它提供了以下代码示例来说明隐式允许 this 引用转义(不要这样做,特别是在构造函数中):
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener (
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
}
);
}
}
这本书接着说:
当
ThisEscape发布EventListener时,它隐式地 也发布封闭的ThisEscape实例,因为内部 类实例包含对封闭实例的隐藏引用。
我从Java的角度理解上面的话,但是我想不出一个例子上面代码的EventListener转义封闭引用this是有害的吗?以什么方式?
例如,如果我创建一个ThisEscape 的新实例:
ThisEscape myEscape = new Escape(mySource);
然后呢?现在危害如何?它在哪些方面有害?
有人可以使用上面的代码作为基础并向我解释它是如何有害的吗?
======= 更多 ======
本书试图表达类似匿名EventListener 的内容,其中包含对尚未完全构造的包含类实例的隐藏引用。我想在例子中知道,这个未完全构造的引用怎么会被滥用,我更喜欢看一个关于这一点的代码示例。
本书给出了正确的做事方式,即使用静态工厂方法,如下所示:
public static SafeListener newInstance(EventSource source) {
SafeListener safe = new SafeListener();
source.registerListener (safe.listener);
return safe;
}
我只是不明白整件事的重点。
【问题讨论】:
-
感谢您提出这个问题。
标签: java inner-classes