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
недействителен к тому времени? Видимо, после этого происходит несколько вуду, но что?