什么是“不完全构造的对象”?
Goetz的Java Concurrency in Practice,第41页,提到了引用如何在构建过程中逃脱。一个“不要这样做”的例子:this
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
这里是通过引用封闭实例的事实来“转义”的。这种情况可以通过使用静态工厂方法(首先构造普通对象,然后注册侦听器)而不是公共构造函数(完成所有工作)来解决。这本书继续说:this
doSomething(e)
ThisEscape
从其构造函数中发布对象可以发布未完全构造的对象。即使发布是构造函数中的最后一个语句,也是如此。如果引用在构造过程中转义,则认为对象未正确构造。
this
我不太明白这个。如果发布是构造函数中的最后一个语句,那么在此之前是否已经完成了所有构造工作?为什么到那时无效?显然,在那之后还有一些巫毒教,但那又如何呢?this