2010-02-04 68 views
30

¿Hay alguna referencia definitiva sobre esto en la programación?¿Cuál es la diferencia entre copiar y clonar?

Veo a mucha gente referirse a la copia profunda y la clonación como la misma cosa. ¿Es esto cierto?

¿Es dependiente del idioma?

Un pequeño punto, pero me molestaba ...

+3

No creo que haya un consenso claro en cuanto a su significado relativo. –

Respuesta

26

No hay una definición formal de estos conceptos, al menos no una que se extiende por todos los idiomas.

¿Qué hay por lo general común sin embargo:

  • clon - crear algo nuevo sobre la base de algo que existe.
  • copia - copia de algo que existe a otra cosa (que también ya existe).
1

En C++ - tierra "clonación" se suele modismo para los objetos de copia profunda clases polimórficas.

En Java/C# Sospecho que estos términos se usan de manera más intercambiable.

2

Yo diría que copiar y clonar son términos análogos. Lo único que tal vez deberías saber es que obtienes una copia poco profunda y una copia profunda. La copia superficial solo hace una copia de un objeto en el nivel raíz donde una copia profunda producirá una copia de un objeto y todos sus objetos secundarios.

9

Sí, hay una diferencia. En cuanto a las dependencias de idioma, algunos lenguajes pueden hacer todas las copias superficiales, profundas y perezosas. Algunos solo hacen copias superficiales. Entonces sí, a veces depende del idioma.

Ahora, toma por ejemplo una matriz:

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

la matriz “numbersCopy” ahora contiene los mismos valores, pero lo más importante el propio objeto de matriz apunta a la misma referencia de objeto como el “número” array.

Así que si tuviera que hacer algo como:

numbersCopy[2] = 0; 

¿Cuál sería el resultado de las siguientes afirmaciones?

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

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

Teniendo en cuenta ambas matrices apuntan a la misma referencia que se pueden conseguir:

Pero lo que si queremos hacer una copia distinta de la primera matriz con su propio ¿referencia? Bueno, en ese caso, querríamos clonar la matriz. Al hacerlo, cada conjunto tendrá su propia referencia de objeto. Veamos cómo funcionará.

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

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

la matriz “numbersClone” ahora contiene los mismos valores, pero en este caso el propio objeto de matriz puntos de referencia diferente de la matriz “números”.

Así que si tuviera que hacer algo como:

numbersClone[2] = 0; 

lo que sería la salida ahora para las siguientes afirmaciones?

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

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

lo has adivinado:

Source

3

más concisa:

  • copia: replicar a instancia existente (superficial o profunda)
  • clon: replicar a nueva instancia (siempre profunda)

hay consenso en cuanto a los desarrolladores descuidadamente intercambiarlos; sin embargo, uno puede presionar lo anterior basándose en:

  1. La etimología (Biología) implica que la noción de "clon superficial" no tiene sentido ya que no es genéticamente idéntica; la clonación implica integridad para propagar la entidad.
  2. Copiar históricamente implica replicación en un medio existente (copiar un libro o pintura, etc.) P. ej., Una fotocopia copia una imagen en una hoja de papel existente; si uno pudiera clonar de alguna manera un pedazo de papel, el resultado sería una nueva hoja de papel.
  3. Se podría "copiar" una referencia de objeto pero nunca se podría "clonar" una referencia de objeto.
Cuestiones relacionadas