Devi assolutamente usare clone? La maggior parte delle persone concorda sul fatto che Java clonesia 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 Cloneablesia rotto, ma succede.
Puoi leggere ulteriori discussioni sull'argomento nel suo libro Effective Java 2nd Edition, Item 11: Override clonejudiciously . 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 clonemetodo 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 AssertionErrorcome 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 clonesenza chiamare super.clone.
Cloneablelanciare unAssertionErrorpiuttosto che un sempliceErrorè un po 'più espressivo.