2009-08-12 7 views

risposta

21

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:

  1. AnyRef.clone(), come la sua controparte in Java, ha un livello di accesso "protetto", quindi la sua non richiamabile da ogni dove.
  2. È 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.

+3

"Ci sono alternative migliori." Ti dispiacerebbe fare riferimento ad alcuni? –

+6

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. –

+0

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