In Java, le classi nidificate possono essere sia static
oppure no. Se sono static
, non contengono un riferimento al puntatore dell'istanza contenente (non sono più chiamate classi interne, sono chiamate classi nidificate).È possibile rendere statiche le classi interne anonime in Java?
Dimenticandosi di creare una classe nidificata static
quando non ha bisogno di quella referenza può portare a problemi con la garbage collection o l'analisi di escape.
È possibile creare anche una classe interna anonima static
? Oppure il compilatore lo calcola automaticamente (che potrebbe, perché non ci possono essere sottoclassi)?
Per esempio, se faccio un comparatore anonima, ho quasi mai bisogno il riferimento verso l'esterno:
Collections.sort(list, new Comparator<String>(){
int compare(String a, String b){
return a.toUpperCase().compareTo(b.toUpperCase());
}
}
Quali sono i problemi con "garbage collection o escape analysis" quando si dimentica di rendere statica una classe interna? Ho pensato che questo riguardasse solo le prestazioni ... –
L'istanza della classe interna mantiene vivo un riferimento alla sua istanza esterna, anche se non ne hai bisogno. Questo potrebbe impedire che la roba venga raccolta dalla spazzatura. Immaginate un oggetto fabbrica (pesante in termini di risorse) che crea istanze leggere di qualcosa. Dopo che la fabbrica ha fatto il suo lavoro (ad esempio durante l'avvio dell'applicazione), potrebbe essere smaltita, ma funziona solo se le cose che ha creato non si ricollegano. – Thilo
Lo so, questo è solo un esempio, ma poiché è ricorrente, si dovrebbe menzionare che 'Collections.sort (list, String.CASE_INSENSITIVE_ORDER)' funziona da Java 2, leggi, poiché esiste l'API Collection ... – Holger