В чем разница между копированием и клонированием? - PullRequest
29 голосов
/ 04 февраля 2010

Есть ли конкретная ссылка на это в программировании?

Я вижу, что многие люди относятся к глубокому копированию и клонированию как к одному и тому же. Это правда?

Это зависит от языка?

Небольшой момент, но это беспокоило меня ...

Ответы [ 5 ]

26 голосов
/ 04 февраля 2010

Нет формального определения этих понятий, по крайней мере, одного, которое охватывает все языки.

Что обычно, хотя:

  • клон - создать что-то новое на основе чего-то существующего.
  • копирование - копирование из чего-то, что существует во что-то еще (что также уже существует).
10 голосов
/ 04 февраля 2010

Да, есть разница. Что касается языковых зависимостей, некоторые языки могут выполнять все мелкое, глубокое и ленивое копирование. Некоторые делают только мелкие копии. Так что да, это зависит от языка иногда.

Теперь возьмем, к примеру, массив:

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

Массив «numbersCopy» теперь содержит те же значения, но, что более важно, сам объект массива указывает на ту же ссылку на объект, что и массив «numbers».

Так что, если бы я сделал что-то вроде:

  numbersCopy[2] = 0;

Каким будет вывод следующих операторов?

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

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

Учитывая, что оба массива указывают на одну и ту же ссылку, мы получили бы:

0

0

Но что, если мы хотим сделать отдельную копию первого массива с его собственной ссылкой? Ну, в этом случае мы хотели бы клонировать массив. При этом каждый массив теперь будет иметь собственную ссылку на объект. Давайте посмотрим, как это будет работать.

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

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

Массив «numbersClone» теперь содержит те же значения, но в этом случае сам объект массива указывает на ссылку, отличную от массива «numbers».

Так что, если бы я сделал что-то вроде:

  numbersClone[2] = 0;

Что бы вывести сейчас для следующих операторов?

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

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

Вы догадались:

4

0

Источник

3 голосов
/ 26 мая 2015

Самое краткое:

  • копия: репликация на существующий экземпляр (мелкий или глубокий)
  • клон: репликация на новый экземпляр (всегда глубокий)

Нет единого мнения, поскольку разработчики небрежно обмениваются ими; однако можно лоббировать вышеизложенное на основании:

  1. Этимология (биология) подразумевает, что понятие «мелкий клон» бессмысленно, поскольку генетически не идентично; клонирование подразумевает полноту для распространения сущности.
  2. Историческое копирование подразумевает копирование на существующий носитель (копирование книги или рисунка и т. Д.). Например, фотокопия копирует изображение на существующий лист бумаги; если бы кто-то мог как-то клонировать лист бумаги, результатом был бы новый лист бумаги.
  3. Можно «скопировать» ссылку на объект, но нельзя «клонировать» ссылку на объект.
2 голосов
/ 04 февраля 2010

Я бы сказал, что копирование и клонирование - это аналогичные термины. Единственное, что вы должны знать, это то, что вы получаете мелкую копию и глубокую копию. При поверхностном копировании создается только копия объекта на корневом уровне, тогда как при глубоком копировании создается копия объекта и всех его дочерних объектов.

1 голос
/ 04 февраля 2010

В C ++ - "клонирование" земли обычно является идиомой для глубокого копирования объектов полиморфных классов.

В Java / C # я подозреваю, что эти термины используются более взаимозаменяемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...