Devez-vous absolument utiliser clone
? La plupart des gens s'accordent à dire que le clone
est cassé.
Josh Bloch on Design - Constructeur de copie ou 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 que clone
est profondément brisé. [...] C'est une honte que... Cloneable
est cassé, mais ça arrive.
Vous pouvez lire plus d'informations sur le sujet dans son livre. Effective Java 2nd Edition, Item 11 : Override clone
judicieusement . Il recommande plutôt d'utiliser un constructeur de copie ou une fabrique de copie.
Il a poursuivi en écrivant des pages et des pages sur la façon dont, si vous vous sentez obligé, vous devriez mettre en œuvre les mesures suivantes clone
. Mais il a terminé par ceci :
Toutes ces complexités sont-elles vraiment nécessaires ? Rarement. Si vous étendez une classe qui implémente Cloneable
vous n'avez pas d'autre choix que de mettre en place un système de gestion de l'information bien conçu clone
méthode. Sinon, il est préférable de fournir des moyens alternatifs de copie d'objets, ou simplement de ne pas fournir cette capacité. .
C'est lui qui a mis l'accent, pas moi.
Puisque vous avez clairement indiqué que vous n'avez 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 c'est le cas, alors vous pouvez garantir que vous allez JAMAIS attraper un CloneNotSupportedException
. Lancer AssertionError
comme certains l'ont suggéré semble raisonnable, mais vous pouvez également ajouter un commentaire qui explique pourquoi le bloc de capture ne sera jamais saisi dans ce cas particulier .
Alternativement, comme d'autres l'ont suggéré, vous pouvez peut-être implémenter clone
sans appeler super.clone
.
6 votes
Si vous savez que la classe parent implémente
Cloneable
puis en lançant unAssertionError
plutôt qu'un simpleError
est un peu plus expressif.0 votes
Edit : Je préférerais ne pas utiliser clone(), mais le projet est déjà basé dessus et ça ne vaudrait pas la peine de refactorer toutes les références à ce stade.
0 votes
Il est préférable de s'y atteler maintenant plutôt que plus tard (à moins que vous ne soyez sur le point d'entrer en production).
0 votes
Il nous reste un mois et demi sur le calendrier jusqu'à ce que ce soit terminé. Nous ne pouvons pas justifier le temps.
0 votes
Je pense que cette solution est parfaite. Et ne vous sentez pas mal d'utiliser le clone. Si vous avez une classe qui est utilisée comme un objet de transport et qu'elle ne contient que des primitives et des immuables comme String et Enums, tout autre chose que clone serait une perte de temps complète pour des raisons dogmatiques. Gardez juste à l'esprit ce que clone fait et ce qu'il ne fait pas ! (pas de clonage profond)