2012-02-29 4 views
2

Я нашел this answer о клонировании объектов java. Однако, с подходом в принятом ответе, является ли клонированный объект полностью новым экземпляром? Я имею в виду не связанную копию?Клонирование объекта Java

Я спрашиваю об этом, потому что объект java, который мне нужно клонировать, является «глобальным объектом», который обновляется в определенный момент времени. И в какой-то момент времени мне нужно «снимок» объекта и по существу поставить, чем на HashMap.

+0

Определите, что именно вы подразумеваете под «связанной копией». – NPE

+0

Я имею в виду, что на связанной ссылке высокого уровня копии, которые имеют другой экземпляр, но когда я меняю источник, копии меняются. – xybrek

+0

Я думаю, что правильный термин был «Мелкие копии», так что принятый ответ на сообщение, связанный в моем вопросе, является мелкой копией. Это то, что я имею в виду. – xybrek

ответ

2

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

Новый объект получит текущее состояние исходного объекта. Это легко для строк и java-примитивов.

Для объектов это более сложно: текущее состояние является указателем на другой объект, и если эти другие объекты будут изменены, изменения будут отражены в вашем снимке. Если вам нужно этого избежать, вам также придется клонировать эти объекты (глубокое клонирование).

«Проблема» с клонированием через конструктор копирования: cloneable классы должны предоставить такой конструктор. Легко, если у вас есть исходный код, то вы можете реализовать его самостоятельно. В противном случае вам, возможно, придется играть с Reflection API и реализовать фабрику клонов , которая была бы хотя бы ... ошибочной, сложной.

+0

Да, мне может потребоваться глубокое клонирование. – xybrek

1

Вы должны определить, насколько глубоко вы хотите клонировать. Так или иначе, это не клонирование. Лучше реализовать клонирование и глубокое копирование любого соответствующего поля. На другие объекты поля можно ссылаться.

+0

Мне просто нужно убедиться, что объекты в поле HashMap в исходном объекте копируются в клонированный объект. – xybrek

1

Вы можете использовать конструктор копирования для создания клона объекта во временной переменной.

public class foo { 
    private int i = 0; 

    public foo() { this.i = 5; } 
    public foo(foo orig) { this.i = orig.getI(); } 

    public getI() { return this.i; } 
} 

И использовать его как: (! Надо)

foo a = new foo(); 
foo b = new foo(a); 
+0

При таком подходе мне нужно будет напечатать каждое поле, которое будет скопировано в конструкторе копирования. Например, если у меня есть ста полей, мне нужно будет скопировать каждый из них вручную? – xybrek

+0

Да, я протестировал его, и Java не предоставляет конструкторы копирования по умолчанию. – Odinn

Смежные вопросы