Devez-vous absolument utiliser clone
? La plupart des gens conviennent que Java clone
est 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 clone
est profondément brisé. [...] C'est une honte qui Cloneable
est cassée, mais ça arrive.
Vous pouvez lire plus de discussion sur le sujet dans son livre Effective Java 2nd Edition, Item 11: Override clone
judicieusement . 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 clone
mé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 AssertionError
comme 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 clone
sans appeler super.clone
.
Cloneable
alors lancer unAssertionError
plutôt qu'un simpleError
est un peu plus expressif.