Глубокое клонирование в Java - клонирование только создаваемых объектов - PullRequest
1 голос
/ 19 сентября 2010

Для меня проблема заключается в реализации клона для объекта. Этот объект A имеет свои члены-объекты B, которые не были созданы A. Я хочу клонировать A так, чтобы клонировать можно было только объекты, созданные во время создания A. Объекты, которые были переданы в качестве ссылки в объектах A или A или объекте A, не подлежат клонированию. На них следует только ссылаться.

Возможно ли это? Я прошел через некоторые библиотеки глубокого клонирования ( deep - cloner ); кажется, они не могут сделать различие. Я не могу выполнить десериализацию сериализации, так как подозреваю, что это не решит мою проблему. Также объект A, который я должен клонировать, очень сложен. Я привлекаю почти все занятия в проекте. Работает ли утилита сериализации Apache с вышеуказанным случаем?

Ответы [ 2 ]

2 голосов
/ 19 сентября 2010

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

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

1 голос
/ 19 сентября 2010

Вам нужно будет вручную реализовать A.clone(), чтобы он клонировал только те объекты, которые вы хотите клонировать.Реализация по умолчанию Object.clone выполняет операцию поверхностного копирования, поэтому вам нужно сделать что-то вроде этого:

public class A implements Cloneable {

    [...]
    public Object clone() {
        Object obj = null;

        try {
            obj = super.clone();
            // super.clone performs a "shallow copy" operation.
            // Now you will need to manually clone any objects for
            // which a "deep copy" operation is desired, e.g.
            //
            //    obj.memberX = memberX.clone();
            //    obj.memberY = memberY.clone();
            //    ...
            //
        } catch (CloneNotSupportedException ex) {
            // Should not happen..
        }
        return obj;
    }
}

Это предполагает, что вы знаете, какие объекты вы хотите клонировать (т.е. какие объекты были созданыво время строительства А).

...