Клонирование объектов - PullRequest
       22

Клонирование объектов

6 голосов
/ 30 августа 2011

Для целей создания копии объекта и получения доступа к его данным, что лучше и почему?

1.Создайте новый объект и инициализируйте его данными, которые вы хотите клонировать через конструктор

 HashSet<String> myClone = new HashSet<String>(data);

2.Клонируйте объект как есть и приведите его к типу, который, по вашему мнению, будет

 HashSet<String> myClone = (HashSet<String>) data.clone();

Ответы [ 3 ]

2 голосов
/ 30 августа 2011

Обязательно используйте конструктор копирования - clone() действительно довольно испорчен (по крайней мере, большинство людей с этим согласны.) Подробнее см. здесь .

1 голос
/ 30 августа 2011

«Это зависит».Не все классы имеют конструкторы копирования.Некоторые классы определяют clone(), а другие наследуют его от Object.

Если вы думаете о том, как реализовать семантику копирования в своем собственном классе, многие люди рекомендуют против клонирования, но другие рекомендуют это.Третий вариант - это статический фабричный метод, который выполняет эту работу.

Если вы пытаетесь сделать копию какого-либо существующего класса, вы находитесь в зависимости от существующей реализации.Может быть, у него есть clone(), который делает то, что вы хотите, а может, нет.Может быть, у него есть конструктор копирования, а может и нет.

0 голосов
/ 30 августа 2011

Клон не копирует данные, он копирует ссылки ( Мелкая копия ). Итак, если вы хотите сделать глубокое «копирование» и чтобы оно стало независимым от первого, вам придется делать «клонирование по элементам», обычно называемое глубокая копия (есть несколько способов сделать это).

Также вы можете взглянуть на clone() метод класса, который реализует этот HashSet. Если этот класс переопределил этот метод, он может выполнить глубокое копирование. Я рекомендую вам эту книгу: http://www.horstmann.com/corejava.html

...