Você absolutamente tem que usar clone
? A maioria das pessoas concorda que o Java clone
está 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 clone
está profundamente quebrado. [...] é uma pena que Cloneable
está quebrado, mas acontece.
Você pode ler mais discussões sobre o tópico em seu livro Effective Java 2nd Edition, Item 11: Override clone
judiciosamente . 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 clone
mé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 AssertionError
como 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 clone
sem chamar super.clone
.
Cloneable
, lançar um emAssertionError
vez de apenas um planoError
é um pouco mais expressivo.