Глубокое клонирование в Java - клонирование только создаваемых объектов.

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

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


person Niraj Patel    schedule 19.09.2010    source источник


Ответы (2)


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

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

person Stephen C    schedule 19.09.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;
    }
}

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

person Grodriguez    schedule 19.09.2010