Domanda

Sto cercando un modo efficiente per costruire una classe immutabile, proprio come la classe String di Java.

È stato utile?

Soluzione

  1. Tutti i campi devono essere privato e preferibilmente final
  2. Assicurati che la classe non possa essere ignorato: rendi la classe finale, o utilizzare fabbriche statiche e mantenere costruttori privati ??
  3. I campi devono essere compilati da Constructor / Factory
  4. Non fornire setter per il campi
  5. Attenzione alle collezioni. Uso Collections.unmodifiable * . Inoltre, le raccolte devono contenere solo oggetti immutabili
  6. Tutti i getter devono fornire oggetti immutabili o utilizzare copia difensiva
  7. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top