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. –
- 1. Quali sono alcuni modi in cui posso rappresentare un grafico ponderato e diretto in Java?
- 2. Quali sono i modi migliori per bloccare le app Android?
- 3. Quali sono i vari numeri di versione AccuRev?
- 4. Quali sono i modi per modificare una funzione in R?
- 5. Quali sono i diversi modi per sostituire un cursore?
- 6. Quali sono alcuni modi in cui è possibile gestire progetti di linguaggio assembly su larga scala?
- 7. Quali sono i modi migliori per utilizzare decimali e datetime con i buffer del protocollo?
- 8. Quali sono i modi per dichiarare una classe che non può essere istanziata?
- 9. Quali sono alcuni modi migliori per evitare il do-mentre (falso); hack in Java?
- 10. Quali sono i modi per passare i parametri dal controller dopo il reindirizzamento in spring mvc?
- 11. Quali sono i contenitori in Java
- 12. Quali sono alcuni modi in cui le persone distribuiscono le modifiche ai database relazionali utilizzando Node.js?
- 13. Quali fantasiosi modi ci sono ora per supportare lo scripting in java?
- 14. Come faccio a scegliere tra i vari modi di fare il threading in Delphi?
- 15. Quali sono i primi e gli ultimi eventi a cui jquery può connettersi?
- 16. Dato un messaggio codificato, conta il numero di modi in cui può essere decodificato
- 17. Quali sono i modi migliori per proteggere il motore di espressione?
- 18. Quali sono i passaggi per dedurre questo codice pointfree?
- 19. Quali sono i modi migliori per garantire la continuità aziendale con un prodotto SaaS?
- 20. Quali sono i modi migliori per confrontare il contenuto di due oggetti di tipo elenco?
- 21. Quali sono i modi alternativi per trovare next(). Next() in jquery
- 22. Quali sono i modi più idiomatici per combinare i tensori nella torcia?
- 23. Quali sono i modi per ottenere storage persistente e condivisibile solo in html e javascript?
- 24. Quali sono i modi per inserire e recuperare i dati BLOB dal database Oracle utilizzando SQL?
- 25. Quali sono le condizioni in cui si può usare un'istruzione 'when' in Perl 5?
- 26. Quali sono tutti i modi per allocare la memoria in C e in che modo differiscono?
- 27. Quali sono i motivi di questo risultato di riferimento?
- 28. Quali sono i modi per comprimere la directory in un singolo file
- 29. Quali sono i pro e i contro dell'uso di XML per trasferire i dati in questo programma Java?
- 30. Quali sono i problemi reali con Ruby?
Una distinzione chiave è che "questo" esegue lo scappamento in uno stato parziale prima che sia consentito di essere completamente costruito. – phatfingers