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;}
}