O que é um "objeto incompletamente construído"?
Goetz'sConcorrência Java na Prática, página 41, menciona comothis
referência pode escapar durante a construção. Um exemplo "não faça isso":
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
Aquithis
está "escapando" pelo fato de quedoSomething(e)
refere-se ao anexoThisEscape
instância. A situação pode ser corrigida usando métodos estáticos de fábrica (primeiro construa o objeto simples, depois registre o ouvinte) em vez de construtores públicos (executando todo o trabalho). O livro continua:
A publicação de um objeto de dentro de seu construtor pode publicar um objeto de construção incompleta. Isso é verdademesmo que a publicação seja a última declaração no construtor. Se othis
referência escapa durante a construção, o objeto é consideradonão adequadamente construído.
Eu não entendo isso direito. Se a publicação é a última declaração do construtor, todo o trabalho de construção não foi realizado antes disso? Como éthis
não é válido até então? Aparentemente, há algum vodu acontecendo depois disso, mas o que?