115 votes

Pourquoi la méthode clone () est-elle protégée dans java.lang.Object?

Quelle est la raison spécifique pour laquelle clone() est défini comme protégé en java.lang.Object ?

108voto

oxbow_lakes Points 70013

Le fait que le clone est protégé est extrêmement douteuses, comme le fait que l' clone méthode n'est pas déclarée dans l' Cloneable interface.

Il rend la méthode assez inutile pour la prise de copies de données, car on ne peut pas dire:

if(a instanceof Cloneable) {
    copy = ((Cloneable) a).clone();
}

Je pense que la conception de l' Cloneable est maintenant largement considéré comme une erreur (citation ci-dessous). Normalement j'veux être en mesure de faire des implémentations de l'interface Cloneable mais pas nécessairement l'interface Cloneable (similaire à l'utilisation d' Serializable). Cela ne peut se faire sans réflexion:

ISomething i = ...
if (i instanceof Cloneable) {
   //DAMN! I Need to know about ISomethingImpl! Unless...
   copy = (ISomething) i.getClass().getMethod("clone").invoke(i);
}

Citation De Josh Bloch Effectif de Java:
"La Clonable interface a été conçue comme un mixin interface pour les objets pour faire de la publicité qu'ils permettent le clonage. Malheureusement, il ne parvient pas à servir à cette fin ... C'est un très atypique l'utilisation d'interfaces et de ne pas être émulé ... pour la mise en œuvre de l'interface pour avoir un effet sur une classe, elle et toutes ses super-classes doivent obéir à une assez complexe, inapplicable et en grande partie sans-papiers protocole"

30voto

Bill K Points 32115

Le Clonable interface est tout simplement un marqueur de dire la classe d'appui clone. La méthode est protégé parce que vous ne devriez pas l'appeler sur un objet, vous pouvez (et devriez) override public.

De Soleil:

Dans la classe de l'Objet, la méthode clone() est déclarée protégée. Si tout ce que vous faire est de mettre en œuvre Clonable, seuls les sous-classes et les membres de la même package sera en mesure d'invoquer un clone() sur l'objet. Pour permettre à toute la classe dans un package pour accéder à la méthode clone (), vous aurez à le remplacer et de le déclarer public, comme cela est fait ci-dessous. (Lorsque vous remplacez une méthode, vous pouvez le rendre moins privé, mais pas plus privé. Ici, le protégé méthode clone() dans l'Objet est remplacée comme une méthode publique.)

8voto

Andrew Hare Points 159332

clone est protégé parce que c'est quelque chose qui doit être remplacé afin qu'il soit spécifique à la classe actuelle. Bien qu'il soit possible de créer une méthode publique clone qui clonerait n'importe quel objet, cela ne serait pas aussi efficace qu'une méthode écrite spécifiquement pour la classe qui en a besoin.

4voto

Silfverstrom Points 8132

La méthode Clone ne peut pas être utilisée directement sur un objet. C'est pourquoi elle est censée être remplacée par la sous-classe.

Bien sûr, cela pourrait être public et créer une exception appropriée lorsque le clonage n’est pas possible, mais je pense que ce serait trompeur.

La manière dont le clone est implémenté à l’heure actuelle vous fait penser à la raison pour laquelle vous voulez utiliser le clone et à la manière dont vous voulez que votre objet soit cloné.

2voto

Janusz Points 52607

Du javadoc de clonable.

 * By convention, classes that implement this interface (cloneable) should override 
* <tt>Object.clone</tt> (which is protected) with a public method.
* See {@link java.lang.Object#clone()} for details on overriding this
* method.

* Note that this interface does <i>not</i> contain the <tt>clone</tt> method.
* Therefore, it is not possible to clone an object merely by virtue of the
* fact that it implements this interface.  Even if the clone method is invoked
* reflectively, there is no guarantee that it will succeed.
 

Vous pouvez donc appeler clone sur chaque objet, mais cela ne vous donne généralement pas les résultats souhaités ni une exception. Mais n’est encouragé que si vous implémentez clonable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X