2012-06-30 10 views
5

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?

+1

Una distinzione chiave è che "questo" esegue lo scappamento in uno stato parziale prima che sia consentito di essere completamente costruito. – phatfingers

risposta

4

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.

+0

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

+0

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. –

Problemi correlati