Devi assolutamente usare clone
? La maggior parte delle persone concorda sul fatto che Java clone
sia rotto.
Josh Bloch su Design - Copy Constructor vs Cloning
Se hai letto l'articolo sulla clonazione nel mio libro, soprattutto se leggi tra le righe, saprai che secondo me clone
è profondamente rotto. [...] È un peccato che Cloneable
sia rotto, ma succede.
Puoi leggere ulteriori discussioni sull'argomento nel suo libro Effective Java 2nd Edition, Item 11: Override clone
judiciously . Raccomanda invece di utilizzare un costruttore di copie o una fabbrica di copie.
Ha continuato a scrivere pagine di pagine su come, se ritieni di doverlo fare, dovresti implementare clone
. Ma ha chiuso con questo:
Tutte queste complessità sono davvero necessarie? Raramente. Se estendi una classe che implementa Cloneable
, non hai altra scelta che implementare un clone
metodo ben comportato . Altrimenti, è meglio fornire mezzi alternativi per la copia di oggetti o semplicemente non fornire la capacità .
L'enfasi era sua, non mia.
Dato che hai chiarito che non hai altra scelta che implementare clone
, ecco cosa puoi fare in questo caso: assicurati che MyObject extends java.lang.Object implements java.lang.Cloneable
. Se è così, puoi garantire che non prenderai MAI un file CloneNotSupportedException
. Lanciare AssertionError
come alcuni hanno suggerito sembra ragionevole, ma puoi anche aggiungere un commento che spiega perché il blocco catch non verrà mai inserito in questo caso particolare .
In alternativa, come hanno suggerito anche altri, puoi magari implementare clone
senza chiamare super.clone
.
Cloneable
lanciare unAssertionError
piuttosto che un sempliceError
è un po 'più espressivo.