Le classi interne sono buone per rappresentare oggetti che sono intesi come privati o in qualche modo intimamente legati alla classe che li ospita. Occasionalmente ci sono ragioni tecniche per l'uso di classi interne (ad es. Simulazioni di chiusure). Hanno anche ridotto l'inquinamento dello spazio dei nomi.
Uno svantaggio delle classi interne è che se accedono a membri privati (campi o funzioni) della classe che li include, il compilatore genererà le funzioni di accesso a tali membri. I puristi della lingua discuteranno se questa rottura dell'incapsulamento sia una buona cosa o una brutta cosa. Le funzioni di accesso aggiungono un po 'di overhead ad ogni accesso (che di solito non è un fattore, ma è così). Un altro svantaggio è che rende il file sorgente più complesso e quindi più difficile da gestire. (Di tanto in tanto sono stato punito modificando una funzione nella classe interna mentre pensavo che fosse nella classe esterna, e viceversa.) Infine, le classi interne tendono a non essere riusabili, mentre le classi separate possono spesso essere parametrizzate per avere molteplici usi .
questi pro e contro sono fuori dalla parte superiore della mia testa. Sono sicuro che altri avranno pensieri aggiuntivi.
UPDATE:
In questo Google IO video l'opzione AsyncTask interna è chiaramente indicato come opzione sbagliata.
fonte
2011-01-28 01:50:03
Dopo un po 'di utilizzo come classi pubbliche separate vedo che è molto più utile. – neteinstein
@NeTeInStEiN - Per un AsyncTask, una classe interna (rispetto a una classe statica nidificata) è sempre errata per motivi tecnici: un'attività può essere eliminata (a causa di una modifica della configurazione) senza arrestare AsyncTask. Se AsyncTask fosse una classe interna, ciò causerebbe la perdita della vecchia attività perché AsyncTask avrebbe un riferimento (nascosto) all'istanza della classe esterna. Alcuni cambiamenti di orientamento del telefono causerebbero quindi la morte del processo a causa dell'esaurimento della memoria. per una soluzione al problema (molto comune) di AsyncTask in possesso di un riferimento ad un'attività –