Possibili modi per rendere immutabile un oggetto
-
06-07-2019 - |
Domanda
Sto cercando un modo efficiente per costruire una classe immutabile, proprio come la classe String di Java.
Soluzione
- Tutti i campi devono essere
privato
e preferibilmentefinal
- Assicurati che la classe non possa essere ignorato: rendi la classe finale, o utilizzare fabbriche statiche e mantenere costruttori privati ??
- I campi devono essere compilati da Constructor / Factory
- Non fornire setter per il campi
- Attenzione alle collezioni. Uso
Collections.unmodifiable *
. Inoltre, le raccolte devono contenere solo oggetti immutabili - Tutti i getter devono fornire oggetti immutabili o utilizzare copia difensiva
- Non fornire alcun metodo che cambia lo stato interno di Oggetto.
Tom Hawtin ha sottolineato che final
può essere facoltativo. String
class
ha una cache hash
var che viene assegnata solo quando viene chiamata la funzione hash.
Altri suggerimenti
Se si popolano tutti i campi utilizzando il costruttore e si rendono definitivi i campi, ci si trova a metà strada.
Se i campi utilizzano tipi personalizzati, potrebbe essere necessario renderli anche immutabili.
Tutti i campi che sono raccolte dovrebbero usare le raccolte non modificabili - per essere al sicuro.
Devi preoccuparti del grafico dell'oggetto!
Tutti i metodi sull'oggetto devono occuparsi di campi non finali. Per esempio. String.add crea una nuova stringa. Se hai bisogno di mutare un campo, fallo tramite un costruttore di copie.
Infine, finalizza l'oggetto.
Un oggetto è immutabile se nessuno dei suoi campi può essere modificato, quindi tali campi devono essere final
. Se non vuoi che il tuo oggetto venga suddiviso in sottoclassi, puoi rendere la classe stessa final
, proprio come String.
Per costruire facilmente un oggetto immutabile con molte informazioni, dovresti guardare Factory Pattern
Per ulteriori informazioni, vedere Wikipedia