Il metodo clone e l'interfaccia clonabile - 1

"Ciao, Amico!"

"Ciao Kim."

"Ti parlerò del metodo clone()."

"Lo scopo di questo metodo è clonare un oggetto, o in altre parole, creare un clone/copia/duplicato dell'oggetto."

"Quando viene chiamato questo metodo, la macchina virtuale Java crea e restituisce un duplicato dell'oggetto su cui è chiamata.

L'implementazione del metodo clone da parte della classe Object è molto primitiva: viene creato un solo nuovo oggetto e ai suoi campi vengono assegnati i valori dei campi dell'oggetto originale.

Se l'oggetto copiato contiene riferimenti ad altri oggetti, tali riferimenti verranno copiati. Non verranno creati duplicati di tali oggetti."

"Hmm. Non c'è molto da dire."

"Il fatto è che la macchina virtuale Java non sa quali oggetti possono o non possono essere clonati. Ad esempio, i file non possono essere clonati. Lo stesso vale per un flusso System.in."

"Quindi, la questione della clonazione completa è stata posta agli sviluppatori di una classe. "Tutto questo è simile a come viene gestito il metodo equals. C'è anche qualcosa di paragonabile a hashCode: l'interfaccia Cloneable."

"L' interfaccia Cloneable è quella che viene chiamata 'interfaccia marker': non ha alcun metodo e viene utilizzata per contrassegnare determinate classi.

"Se lo sviluppatore di una classe ritiene che gli oggetti della classe possano essere clonati, lo contrassegna con questa interfaccia (ovvero rende la classe implementabile Cloneable)."

"Se allo sviluppatore non piace l'implementazione standard del metodo clone, deve scriverne una propria che creerà un oggetto duplicato nel modo giusto."

"Quando chiami il metodo clone (), Java controlla se l'oggetto supporta l'interfaccia Cloneable. Se lo fa, clona l'oggetto usando il metodo clone (); in caso contrario, genera un'eccezione CloneNotSupportedException."

"In altre parole, dobbiamo sovrascrivere il metodo clone o fare in modo che la classe implementi Cloneable?"

"Sì, ma devi ancora eseguire l'override del metodo. Il metodo clone() è dichiarato protetto, quindi può essere chiamato solo dalle classi nel suo pacchetto (java.lang.*) o dalle loro sottoclassi."

"Sono un po' confuso, quindi cosa devo fare per clonare un oggetto?"

"Se si desidera utilizzare il metodo di clonazione «predefinito» della classe Object, è necessario:

" a) Aggiungi l'interfaccia clonabile alla tua classe"

" b) Sovrascrivi il metodo clone e chiama l'implementazione della superclasse all'interno della tua implementazione:"

class Point implements Cloneable
{
 int x;
 int y;

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

"Oppure puoi scrivere un'implementazione del metodo clone interamente da solo:"

class Point
{
 int x;
 int y;

 public Object clone()
 {
  Point point = new Point();
  point.x = this.x;
  point.y = this.y;
  return point;
 }
}

"È un metodo interessante. Sono sicuro che lo userò. Di tanto in tanto..."