web-dev-qa-db-fra.com

Java: opération clone () appelant super.clone ()

Je ne comprends pas complètement l'idée de retourner super.clone () dans la méthode clone () d'une classe. Tout d'abord, cela ne serait-il pas lié au fait qu'il renvoie un objet qui est une superclasse qui contient MOINS de données que demandé, car une superclasse "n'est pas une" sous-classe, mais une sous-classe "est une" superclasse. Et s'il y avait une longue chaîne de sous-classes, chacune appelant super.clone (), pourquoi cela ne conduirait-il pas à appeler éventuellement Object.clone () à la racine de la chaîne, qui n'est pas une des sous-classes?

Désolé si c'était confus; Je m'embrouille parfois

42
TurtleToes

L'implémentation de clone() dans Object vérifie si la classe réelle implémente Cloneable et crée une instance de cette classe réelle.

Donc, si vous voulez rendre votre classe clonable, vous devez implémenter Cloneable et downcast le résultat de super.clone() à votre classe. Un autre fardeau est que l'appel à super.clone() peut lancer un CloneNotSupportedException que vous devez intercepter, même si vous savez que cela ne se produira pas (puisque votre classe implémente Cloneable) .

L'interface Cloneable et la méthode clone sur la classe Object sont un cas évident de conception orientée objet qui a mal tourné.

53
Laurent Pireyn

Considérez ceci: vous avez une chaîne de classes héritées. chacun peut (ou non) avoir ses propres variables. ce que fait le clone, contrairement à l'opérateur égal (==) qui duplique la référence, est une copie clonée de l'objet avec une nouvelle référence. Pour l'exemple ci-dessus, vous souhaitez cloner le dernier objet de la chaîne. Comme le dernier objet est construit à partir de ses superclasses, où chacune peut avoir une implémentation de méthode de clonage différente, il est très logique d'appeler l'implémentation de superclasse de clone pour recevoir d'abord un objet parent cloné avant de cloner son propre objet.

Un autre terme généralement associé au clonage est le clonage peu profond et profond. le clonage superficiel fait référence à la création d'une réplique exacte d'un objet, tandis que le clonage profond crée une réplique d'un objet et de tout objet enfant auquel l'objet d'origine fait référence.

Plus d'informations sur le clonage sur ce lien

5
Assaf Adato

Lisez le javadoc de Object.clone() plus attentivement: il retourne une copie de l'objet. La copie est une autre instance de la même classe que celle de l'objet sur lequel le clone est appelé. C'est à dire. foo.clone().getClass() == foo.getClass().

5
JB Nizet