在Goetz的《Java并发编程实践》第41页中提到,this
引用可能在构造期间逃逸。以下是一个“不要这样做”的例子:
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
这里通过doSomething(e)
引用到封闭的ThisEscape
实例,实现了"逃逸"。可以通过使用静态工厂方法(先构造普通对象,然后注册监听器)而非公共构造函数(执行所有工作)来解决这种情况。书中继续讲述:
在构造函数内部发布对象可能会发布一个未完全构造的对象。即使发布是构造函数中的最后一条语句也是如此。如果
this
引用在构造过程中泄漏出去,那么该对象被认为是未经适当构造的。
我不太理解这个问题。如果发布是构造函数中的最后一条语句,那么所有的构造工作不都已经完成了吗?为什么此时this
无效?显然,在此之后发生了某些神奇的事情,但是是什么呢?
EventListener
将首先被构建,然后才是ThisEscape
。 - Anand Kadhi