Devez-vous absolument utiliser clone? La plupart des gens conviennent que Java cloneest cassé.
Josh Bloch sur la conception - Constructeur de copie versus clonage
Si vous avez lu l'article sur le clonage dans mon livre, surtout si vous lisez entre les lignes, vous saurez que je pense qu'il cloneest profondément brisé. [...] C'est une honte qui Cloneableest cassée, mais ça arrive.
Vous pouvez lire plus de discussion sur le sujet dans son livre Effective Java 2nd Edition, Item 11: Override clonejudicieusement . Il recommande à la place d'utiliser un constructeur de copie ou une fabrique de copies.
Il a continué en écrivant des pages de pages sur la façon dont, si vous pensez que vous devez, vous devriez mettre en œuvre clone. Mais il a conclu avec ceci:
Toutes ces complexités sont-elles vraiment nécessaires? Rarement. Si vous étendez une classe qui implémente Cloneable, vous n'avez guère d'autre choix que d'implémenter une cloneméthode bien conduite . Sinon, il vaut mieux fournir des moyens alternatifs de copie d'objets, ou simplement ne pas fournir la capacité .
L'accent était le sien, pas le mien.
Puisque vous avez clairement indiqué que vous n'aviez pas d'autre choix que de mettre en œuvre clone, voici ce que vous pouvez faire dans ce cas: assurez-vous que MyObject extends java.lang.Object implements java.lang.Cloneable. Si tel est le cas, vous pouvez garantir que vous n'attraperez JAMAIS un CloneNotSupportedException. Lancer AssertionErrorcomme certains l'ont suggéré semble raisonnable, mais vous pouvez également ajouter un commentaire expliquant pourquoi le bloc catch ne sera jamais entré dans ce cas particulier .
Alternativement, comme d'autres l'ont également suggéré, vous pouvez peut-être implémenter clonesans appeler super.clone.
Cloneablealors lancer unAssertionErrorplutôt qu'un simpleErrorest un peu plus expressif.