Ora non capisco grossomodo cosa fa quel super.clone(). Cioè chiama il comando clone sulla superclasse e poi con il return lo ritorna?
Cioè in realtà non reimplementa nulla in questo caso, tutto quel codice serve solo per rendere il clone di object da privato a pubblico o sbaglio?
[/code]
Il super.clone(), come detto, richiama quello della superclasse e ritorna così l'oggetto Clonato.
Il clone di Object
non è privato, ma è protected; questo significa che possono richiamarlo solamente le sue sottoclassi.
La versione mostrata sopra ci costringe ad effettuare un cast.
Sul sito, ti mostra questo esempio:
codice:
public Persona clone() {
try {
return (Persona) super.clone();
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
Persona p1 = new Persona("Mario", "Rossi", "Via Firenze 1", new GregorianCalendar(2000, 0, 1).getTime());
Persona p2 = p1.clone();
p1.getDataDiNascita().setTime(System.currentTimeMillis());
System.out.println(p1.getDataDiNascita().equals(p2.getDataDiNascita()));
Questo essenzialmente è "uguale" a quello mostrato sopra.
Come abbiamo detto, ogni oggetto è una sottoclasse di Object; questo significa che gli oggetti creati dal programmatore non fanno eccezione!
La differenza è che in questo modo si fa già tornare un'istanza di Persona. Bada bene...questo è corretto con da java 1.6 (come dice sul sito, con
una versione > alla 1.5 di Java, prima non era permesso); ora questa operazione è consentita poichè Persona è una sottoclasse di Object, quindi
questa firma del metodo non crea problemi.
Il loro metodo non da problemi! Lo reimplementano poichè suppongono la memorizzazione di un oggetto Date (ma possiamo supporre un GregorianCalendar),
e questo oggetto non è immutabile (può essere cambiato). Se fai un clone dell'oggetto Persona, che al suo interno ha un Date (o GregorianCalendar o
un oggetto mutabile) è necessario clonarlo al fine di avitare condivisioni di memoria.
Ma chehe accadrebbe precisamente e praticamente?
Praticamente, se non crei un clone anche dell'oggetto mutabile (Date nel loro caso) ti ritrovi con 2 oggetti che puntano allo stesso oggetto. Questo
significa che modificando la data di un oggetto modifichi inevitabilmente anche l'altra.
Se hai dubbi, chiedi!