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. Ситуация может быть исправлена с помощью статических методов factory (сначала создайте простой объект, а затем зарегистрируйте слушателя) вместо публичных конструкторов (выполняющих всю работу). Книга продолжается:
Публикация объекта из его конструктора может публиковать неполностью сконструированный объект. Это верно, даже если публикация является последним утверждением в конструкторе. Если во время построения избегается ссылка
this, объект считается неправильно сконструированным.
Я не совсем понимаю это. Если публикация является последним утверждением в конструкторе, не все ли было сделано до этого? Почему this недействителен к тому времени? Видимо, после этого происходит несколько вуду, но что?