Você absolutamente tem que usar clone? A maioria das pessoas concorda que o Java cloneestá quebrado.
Josh Bloch no projeto - Construtor de cópia versus clonagem
Se você leu o item sobre clonagem em meu livro, especialmente se você leu nas entrelinhas, você saberá que acho que cloneestá profundamente quebrado. [...] é uma pena que Cloneableestá quebrado, mas acontece.
Você pode ler mais discussões sobre o tópico em seu livro Effective Java 2nd Edition, Item 11: Override clonejudiciosamente . Ele recomenda, em vez disso, usar um construtor de cópias ou uma fábrica de cópias.
Ele escreveu páginas de páginas sobre como, se você sentir que deve, você deve implementar clone. Mas ele fechou com isso:
Todas essas complexidades são realmente necessárias? Raramente. Se você estender uma classe que implementa Cloneable, terá pouca escolha a não ser implementar um clonemétodo bem comportado . Caso contrário, é melhor fornecer meios alternativos de cópia de objetos ou simplesmente não fornecer esse recurso .
A ênfase era dele, não minha.
Como você deixou claro que não tem escolha a não ser implementar clone, aqui está o que você pode fazer neste caso: certifique-se disso MyObject extends java.lang.Object implements java.lang.Cloneable. Se for esse o caso, você pode garantir que NUNCA pegará a CloneNotSupportedException. Lançar AssertionErrorcomo alguns sugeriram parece razoável, mas você também pode adicionar um comentário que explica por que o bloco catch nunca será inserido neste caso específico .
Como alternativa, como outros também sugeriram, talvez você possa implementar clonesem chamar super.clone.
Cloneable, lançar um emAssertionErrorvez de apenas um planoErroré um pouco mais expressivo.