mercoledì 18 aprile 2007

Mutare o non mutare: questo è il dilemma

L'immutabilità di una classe è un aspetto fondamentale della progettazione in Java (e in generale in qualsiasi linguaggio OO) che raramente si insegna ma che ogni giorno, spesso incoscientemente, si incontra.

Considerate ad esempio la classe String, createne un oggetto, e provate a cambiarne lo stato senza creare un nuovo oggetto String. Ad esempio provate ad aggiungerci un carattere in coda o a modificare il primo. Ci siete riusciti?

E' impossibile che ci riusciate, perchè String è immutabile. Ogni qual volta invocate un metodo che la modifica, ad esempio concat, ottenete sì il risultato atteso ma in un nuovo oggetto String.
I più smaliziati, sanno che quando si operano elaborazioni su stringhe conviene usare StringBuffer che altro non è che la versione mutabile di String. Ossia una stringa modificabile senza passare per la creazione di nuove istanze della medesima. In pratica un arraylist di caratteri sotto il vostro totale controllo.

Quanto detto per String vale in generale e rientra nel più generico principio architetturale della mutabilità o dell'immutabilità di una classe.

Detto più formalmente:

  • una classe è mutabile se avendo un riferimento ad un suo oggetto posso cambiarne lo stato
  • una classe è immutabile se avendo un riferimento ad un suo oggetto non è possibile cambiarne lo stato

E' una scelta architetturale che ha conseguenze molto importanti. Pensate ad esempio cosa accade quando voi tornate come risultato di un metodo un riferimento ad una struttura dati interna del vostro oggetto (ad esempio una List privata): l'oggetto chiamante può cambiarvi lo stato senza che voi lo sappiate. Ci son due modi per evitare la cosa: ritornare un clone (metodo clone() di Object) della vostra struttura interna o rendere la struttura ritornata immutabile.

Vi segnalo questi tre articoli [uno, due, tre] come buona introduzione alla creazione e all'uso delle classi immutabili (occhio alla questione del final)

Non ho dubbi che dopo la lettura, comincerete anche voi a vedere mutabilità e immutabilitò ovunque e a chiedervi di fronte ad ogni classe: come la faccio, mutabile o immutabile.

Questo è il dilemma.

Nessun commento: