In Scala, AnyRef.clone
esegue una copia poco profonda o profonda?Scala AnyRef.clone esegue una copia poco profonda o profonda?
risposta
Risposta breve: superficiale.
non-così-breve risposta: A meno che non è sottoposto a override, AnyRef.clone() utilizza Object.clone del Java() come la sua attuazione.
Javadoc su Object.clone():
Il metodo clone per la classe Object esegue un'operazione specifica clonazione. Innanzitutto, se la classe di questo oggetto non implementa l'interfaccia Clonabile, viene lanciata una CloneNotSupportedException . Si noti che tutti gli array sono considerati a implementare l'interfaccia Clonabile. Altrimenti, questo metodo crea una nuova istanza della classe di questo oggetto e inizializza tutti i campi con esattamente il contenuto delle campi corrispondenti di questo oggetto, come per assegnazione; il contenuto di i campi non sono essi stessi clonati. Pertanto, questo metodo esegue una "copia superficiale " di questo oggetto, non un'operazione di "copia profonda ".
Si prega di notare:
- AnyRef.clone(), come la sua controparte in Java, ha un livello di accesso "protetto", quindi la sua non richiamabile da ogni dove.
- È necessario implementare Cloneable in modo che clone() funzioni.
Risposta lunga: Leggi Effective Java, 2nd Edition, punto 11: clone Override giudiziosamente
Sommario: non usarlo. Ci sono alternative migliori.
"Ci sono alternative migliori." Ti dispiacerebbe fare riferimento ad alcuni? –
1. Copia costruttore, per C++. 2. Classe case con metodo "copia" incorporato in Scala 2.8.x. 3. Usa oggetti immutabili: non c'è bisogno di copiare, basta condividere. –
Quindi i costruttori di copia tipo C++ sono in realtà (tipo) okay in Scala? Sono arrivato al linguaggio da C++ e prima di fare i miei primi costruttori di copie volevo vedere se mi mancava un punto. Sembra ... va bene (i miei oggetti hanno uno stato mutabile). – akauppi