Goetz's Java Concurrency in Practice, pagina 41, indica come il riferimento this
può sfuggire durante la costruzione. A "non farlo" esempio:Che cos'è un "oggetto costruito in modo incompleto"?
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
Qui this
è "fuga" di via del fatto che doSomething(e)
riferisce alla racchiude ThisEscape
istanza. La situazione può essere risolta usando metodi factory statici (prima costruisci l'oggetto semplice, quindi registra il listener) invece dei costruttori pubblici (facendo tutto il lavoro). Il libro continua:
Pubblicare un oggetto dal suo costruttore può pubblicare un oggetto costruito in modo incompleto. Questo è vero anche se la pubblicazione è l'ultima istruzione nel costruttore. Se il riferimento
this
fuoriesce durante la costruzione, l'oggetto è considerato non correttamente costruito.
Non ho capito. Se la pubblicazione è l'ultima dichiarazione nel costruttore, non è stato fatto tutto il lavoro di costruzione prima di questo? Come mai è this
non valido per allora? Apparentemente dopo c'è qualcosa di voodoo, ma cosa?
Wow, è sorprendente che i campi 'final', che di solito sono considerati compatibili con la concorrenza, sono il colpevole in questo caso! –
@Joonas: Questo è il problema: sono compatibili con la concorrenza * se si assicura che il riferimento non esca dal costruttore *. Nella maggior parte dei casi è un prezzo piuttosto basso da pagare. –
In realtà, questo si applica a tutti i campi, non solo quelli finali. –