Recentemente ho iniziato ad adottare la migliore pratica di progettare le mie classi per essere immutabili per Effective Java [Bloch2008]. Ho una serie di domande interrelate sui gradi di mutabilità e le loro conseguenze.
Ho incontrato situazioni in cui una classe (Java) I implementata è solo "internamente immutabile" perché è immutabile, tranne che utilizza riferimenti (immutabili) ad altre classi mutabili. Per chiarire, se l'oggetto fosse costruito con i suoi riferimenti impostati su classi immutabili, la classe sarebbe immutabile.
-
Alcuni dei benefici (vedi sotto) delle classi immutabili sono validi anche solo per le classi "internamente immutabili"?
-
Esiste un termine accettato per il sopra menzionata "mutabilità interna"? oggetto immutabile di Wikipedia la pagina utilizza il termine non utilizzato "immutabilità profonda" per descrivere un oggetto i cui riferimenti sono anche immutabili.
-
È la distinzione tra mutabilità e effetto collaterale / stato importante?
Il sito "Java Practices" elenca i seguenti vantaggi delle classi immutabili :
-
sono semplici da costruire, testare e usare
-
sono automaticamente thread-safe e non hanno problemi di sincronizzazione
-
non è necessario un costruttore di copia
-
non hanno bisogno di un'implementazione di clone
-
consente a hashCode di utilizzare lazy inizializzazione e per memorizzarne la cache valore di ritorno
-
non è necessario copiarlo in modo difensivo quando usato come campo
-
crea buoni tasti Mappa e Imposta elementi (questi oggetti non devono cambiare stato mentre nella raccolta)
-
hanno la loro invariante di classe stabilito una volta sulla costruzione, e non ha mai bisogno di essere controllato ancora una volta
-
hanno sempre "failure atomicity" (a termine usato da Joshua Bloch): se un oggetto immutabile lancia un'eccezione, non è mai stato lasciato in un modo indesiderabile o stato indeterminato