Java中的深度克隆 - 仅克隆正在构造的对象

时间:2010-09-19 09:13:24

标签: java clone

对我来说,问题是为对象实现克隆。此对象A的成员对象B,它不是由A创建的。我想克隆A,只有在构造A时才创建的对象才能被克隆。在A或A的对象中作为参考传递的对象或A的对象的对象不被克隆。它们应该只被引用。

这可能吗?我已经浏览了一些深度克隆库源(deep - cloner);看来他们无法区分。我无法进行序列化反序列化,因为我怀疑它不会解决我的情况。我必须克隆的对象A也非常复杂。我涉及项目中的几乎所有课程。 Apache序列化工具是否负责上述情况?

2 个答案:

答案 0 :(得分:2)

这是不可能的。基本上,Java中没有任何内容可以让您确定何时创建给定对象。

如果对象A能够保留其在构造函​​数中创建的成员对象的记录,那么您将能够对此问题产生任何牵引力的唯一方法就是。

答案 1 :(得分:1)

您需要手动实现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期间创建的对象)。