clone() è un metodo ogni classe eredita dalla super classe object e restituisce una copia dell’oggetto clonato (ovvero una nuova istanza dell’oggetto con stessi campi ma area di memoria diversa).

Normalmente non è possibile chiamare il metodo, per fare ciò dobbiamo l’interfaccia segnaposto cloneable, e poi effettuare un override e fornire un implementazione del metodo clone().

Interfaccia Segnaposto

L’interfaccia cloneable è detta interfaccia segna posto perché non contiene nessun metodo, infatti è semplicemente utilizzata per segnalare alla Java Virtual Machine che l’oggetto può essere clonato

Clone Shallow Copy

Il metodo più semplice per effettuare un clone è semplicemente chiamare clone della super classe (object).

public Object clone() {
	super.clone()
}	

Facendo ciò il risultato di clone() sarà una shallow copy ovvero, creeremo un nuovo oggetto con:

  • I campi primitivi (ad esempio intboolean, ecc.) saranno copiati e avranno valori identici all’oggetto originale.
  • I riferimenti agli oggetti (ad esempio StringArray, ecc.) saranno copiati, ma punteranno alla stessa area di memoria dell’oggetto originale.

Clone Deep Copy

Il metodo più complesso per effettuare un clone è creare però ogni campo che è riferimento ad un altro oggetto dovrà implementare cloneable

Copia profonda dell’oggetto originale significa:

  • I campi primitivi (ad esempio intboolean, ecc.) saranno copiati e avranno valori identici all’oggetto originale.
  • I riferimenti agli oggetti (ad esempio StringArray, ecc.) saranno copiati e creeranno nuove istanze degli oggetti riferiti, con valori identici all’oggetto originale.