Как создать копию объекта в Java, а не указатель - PullRequest
5 голосов
/ 25 марта 2011

Допустим, у меня есть объект, который я создал.Я отредактировал некоторые значения в нем, чтобы он отличался от нового объекта (), на который я ссылался.Давайте назовем этот объект f1.Теперь я хочу, чтобы другой объект с именем f2 был копией f1, но не указателем, поэтому, когда я изменяю значение в f2, он также не меняет f1.Как бы я сделал это в Java?

Ответы [ 5 ]

16 голосов
/ 25 марта 2011

Во-первых, пусть ваш класс реализует интерфейс Cloneable.Без этого вызов clone() для вашего объекта вызовет исключение.

Далее переопределите Object.clone(), чтобы он возвратил ваш конкретный тип объекта.Реализация может быть просто:

@Override
public MyObject clone() {
    return (MyObject)super.clone();
}

, если вам не нужно сделать что-то более сложное.Убедитесь, что вы звоните super.clone(), хотя.

Это вызовет весь путь вверх по иерархии до Object.clone(), который копирует каждый фрагмент данных в вашем объекте в новый, который он создает.Ссылки копируются, а не клонируются, поэтому, если вам нужна глубокая копия (клоны объектов, на которые ссылается ваш объект), вам потребуется проделать дополнительную работу в переопределенной функции clone().

6 голосов
/ 25 марта 2011

Большинство объектов имеют метод clone (), который будет возвращать копию этого объекта, поэтому в вашем случае

f2 = f1.clone()
2 голосов
/ 25 марта 2011

Используйте что-то вроде

f2 = f1.clone();

Если у вас есть пользовательские свойства (или члены), вы должны переопределить клон в вашем классе, чтобы сделать глубокое копирование.Вы можете узнать о мелкой и глубокой копии здесь

http://javapapers.com/core-java/java-clone-shallow-copy-and-deep-copy/

2 голосов
/ 25 марта 2011

Вы используете клон .

0 голосов
/ 18 августа 2012

вы можете клонировать или, если вы не можете клонировать, вы можете написать свою собственную функцию для него.

function (variable){
   clone = JSON.parse(JSON.stringify(variable))
   return clone;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...