Goetz's Java-параллелизм на практике , стр. 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
не действует? Видимо, после этого происходит какое-то вуду, но что?