In Java, l’operatore di assegnazione =
non effettua una copia di un oggetto, ma solo del riferimento all’oggetto.
Per creare una copia di un oggetto, è necessario chiamare clone()
.
clone()
non richiama il costruttore della classe, ma la sua implementazione nativa copia l’oggetto campo per campo, creando una shallow copy.-
questo crea problemi nel caso in cui i campi siano riferimenti
-
Per creare copia della propria classe, serve quindi sovrascrivere clone()
.
- è necessario implementare l’interfaccia
Cloneable
, oppureObject.clone()
emetterà l’eccezioneCloneNotSupportedException
.
Per evitare che si copino i riferimenti, è necessario il deep cloning:
- si usa
Object.clone()
per la clonazione dei tipi primitivi - si richiama
.clone()
sui campi che sono riferimenti ad altri oggetti, impostando i nuovi riferimenti nell’oggetto clonato.
public IntVector getCopy()
{
try
{
IntVector v = (IntVector)clone();
v.list = (ArrayList<Integer>)list.clone();
return v;
}
catch(CloneNotSupportedException e){return null;}
}