In Java esistono quattro tipi di classi annidate:
Static nested class non ha accesso ai membri non statici della classe esterna direttamente. Viene compilata come una classe separata, le sue istanze non conservano un riferimento nascosto all'oggetto contenitore.
Inner class (non-static) conserva un riferimento implicito all'oggetto esterno e può accedere ai suoi campi. Questa classe è spesso utilizzata per implementare listener o iteratori con accesso ai dati dell'oggetto esterno.
class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // accesso al campo esterno } } int value = 42; }
Utilizza static nested class per costrutti utilitari o ausiliari legati alla classe esterna per significato, ma non richiedenti accesso al suo stato. Utilizza inner class se hai bisogno di un accesso diretto ai membri non statici della classe esterna per un'integrazione più stretta.
Domanda: "La static nested class può accedere direttamente ai campi non statici dell'istanza della classe esterna?"
Risposta: No, la static nested class non può accedere direttamente ai campi o ai metodi non statici dell'istanza della classe esterna, poiché non contiene (e non conserva) un riferimento all'oggetto della classe esterna.
Storia
In una libreria per la memorizzazione dei dati nella cache è stata utilizzata una static nested class, supponendo la possibilità di accedere alle impostazioni di configurazione della classe esterna. Dopo il tentativo di accesso è comparso un errore di compilazione: la classe interna non vedeva i campi non statici, è stato necessario modificare l'architettura.
Storia
Nell'interfaccia di un'applicazione grafica è stata utilizzata inner class invece di static nested class per le costanti, il che ha comportato un'ulteriore riferimento implicito all'oggetto esterno. Di conseguenza, il garbage collector non riusciva a liberare correttamente la memoria, portando a perdite.
Storia
Durante la serializzazione di una collezione contenente classi interne, si è verificato un problema: la inner class manteneva un riferimento all'oggetto padre, e durante la serializzazione veniva serializzato tutto l'albero delle dipendenze, rallentando notevolmente il processo e aumentando le dimensioni del risultato. Dopo aver cambiato a static nested class, il problema è scomparso.