Quelle est la différence entre la copie et le clonage?

Y a - t-il une référence définitive à ce sujet dans la programmation?

Je vois beaucoup de gens se réfèrent à la copie profonde et au clonage comme la même chose. Est-ce vrai?

Dépend-il de la langue?

Un petit point, mais ça me dérangeait...

30
demandé sur Kurubaran 2010-02-04 17:36:27

5 réponses

Il n'y a pas de définition formelle de ces concepts, du moins pas une qui couvre toutes les langues.

Ce qui est généralement commun cependant:

  • clone - créer quelque chose de nouveau basé sur quelque chose qui existe.
  • copying-copie de quelque chose qui existe à quelque chose d'autre (qui existe également déjà).
26
répondu Anonym 2010-02-04 14:50:19

Oui, il y a une différence. En ce qui concerne les dépendances linguistiques, certaines langues peuvent faire toute copie superficielle, profonde et paresseuse. Certains ne font que des copies superficielles. Donc oui, cela dépend parfois de la langue.

Maintenant, prenez par exemple un Tableau:

int [] numbers = { 2, 3, 4, 5};
int [] numbersCopy = numbers;

Le tableau" numbersCopy " contient maintenant les mêmes valeurs, mais plus important encore, l'objet array lui-même pointe vers la même référence d'objet que le tableau "numbers".

Donc, si je devais faire quelque chose comme:

  numbersCopy[2] = 0;

Ce qui serait la sortie pour les instructions suivantes?

  System.out.println(numbers[2]);

  System.out.println(numbersCopy[2]);

Considérant que les deux tableaux pointent vers la même référence, nous obtiendrions:

0

0

Mais Que faire si nous voulons faire une copie distincte du premier tableau avec sa propre référence? Eh bien, dans ce cas, nous voudrions cloner le tableau. Ce faisant, chaque tableau aura maintenant sa propre référence d'objet. Nous allons voir comment cela va fonctionner.

  int [] numbers = { 2, 3, 4, 5};

  int [] numbersClone = (int[])numbers.clone();

Le tableau" numbersClone " contient maintenant les mêmes valeurs, mais dans ce cas le tableau l'objet lui-même pointe une référence différente de celle du tableau "numbers".

Donc, si je devais faire quelque chose comme:

  numbersClone[2] = 0;

Quelle serait la sortie maintenant pour les déclarations suivantes?

  System.out.println(numbers[2]);

  System.out.println(numbersClone[2]);

Vous l'avez deviné:

4

0

Source

10
répondu 2010-02-04 14:47:41

Le plus concis:

  • copy: répliquer sur une instance existante (peu profonde ou profonde)
  • clone: répliquer vers une nouvelle instance (toujours profonde)

Pas de consensus car les développeurs les échangent négligemment; cependant, on pourrait faire pression sur ce qui précède en fonction de:

  1. L'étymologie (Biologie) implique que la notion de "clone superficiel" est absurde car non génétiquement identique; le clonage implique l'exhaustivité afin de propager l'entité.
  2. Copier implique historiquement réplication sur support existant (copie d'un livre ou d'une peinture, etc.) Par exemple, une photocopie copie une image sur un morceau de papier existant; si l'on pouvait en quelque sorte cloner un morceau de papier, le résultat serait un nouveau morceau de papier.
  3. on pourrait "copier" une référence d'objet mais on ne "clonerait" jamais une référence d'objet.
3
répondu Pete Alvin 2015-05-26 18:25:38

Je dirais que la copie et le clonage sont des termes analogues. La seule chose que vous devriez peut-être être au courant est que vous obtenez une copie superficielle et une copie profonde. Shallow copy ne fait qu'une copie d'un objet au niveau racine où as deep copy produira une copie d'un objet et de tous ses objets enfants.

2
répondu David 2010-02-04 14:46:18

En C++-land ,le" clonage " est généralement un idiome pour copier en profondeur les objets des classes polymorphes.

En Java / C# je soupçonne que ces termes sont utilisés de manière plus interchangeable.

1
répondu Alexander Poluektov 2010-02-04 14:40:03