C'è una domanda su Stack Overflow sul motivo starting a thread inside the constructor is not a good idea. Mi sono reso conto che il risultato di una cosa del genere sarebbe che "questo" può sfuggire. Ho anche letto che publishing a EventListener from constructor è anche una cattiva idea per lo stesso motivo. Quali sono gli altri schemi di cui dovrei essere a conoscenza in cui "questo" può sfuggire?Quali sono i vari modi con cui il "questo" può sfuggire in Java?
risposta
Chiamare qualsiasi metodo di istanza dell'oggetto dal costruttore perde this
a quel mathod. Questo può essere OK, purché tale metodo sia sotto il tuo controllo (non pubblicamente sostituibile), e stai facendo in modo di non far trapelare this
. L'utilizzo di this
come argomento per qualsiasi metodo è, ovviamente, la variante più esplicita e ciò accade quando si dice x.addEventListener(this)
. Un forse più insdidious, poiché meno evidente, modo a fuoriuscire un this
è non utilizzare this
stesso come un argomento, ma un'istanza di una classe interna/locale/anonima, dicono
public class Main
{
private class MyListener extends MouseAdapter { ...}
public Main() {
class Listener1 extends MouseAdapter { ... }
someSwingComponent.addMouseListener(new MyListener()); // inner class
someSwingComponent.addMouseListener(new Listener1()); // local class
someSwingComponent.addFocusListener(new FocusAdapter() { ... }); // anonymous
}
}
In tutti questi casi this
saranno essere l'istanza allegata dell'oggetto passato come argomento del metodo. Se, d'altra parte, si dichiara una classe nidificata static
, sarà non avere un'istanza di inclusione.
Quindi posso supporre che 'questo' possa trapelare ogniqualvolta 'questo' viene passato come argomento ad un metodo alieno (A una classe 'Foo' sono estranei metodi che non ha alcun controllo su e può significare metodi di altre classi o metodi non privati / sovrascrivibili della stessa C)? – Inquisitive
Vedo che non ho chiarito sufficientemente la mia tesi nella prima frase. Intendevo "qualsiasi metodo di istanza di questo oggetto" (quello il cui costruttore viene eseguito). Per quanto riguarda i metodi alieni, il loro livello di accesso non ha importanza. Ciò che importa è se si passa 'questo' a un tale metodo --- esplicitamente o implicitamente attraverso un'istanza di classe interna. –
Una distinzione chiave è che "questo" esegue lo scappamento in uno stato parziale prima che sia consentito di essere completamente costruito. – phatfingers