Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的深度克隆-仅克隆正在构造的对象_Java_Clone - Fatal编程技术网

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

Java中的深度克隆-仅克隆正在构造的对象,java,clone,Java,Clone,我的问题是实现对象的克隆。此对象A的成员对象B不是由A创建的。我希望克隆A,以便只克隆在构造A期间创建的对象。在A或A的对象或A的对象的对象中作为引用传递的对象将不被克隆。它们只应被引用 这可能吗?我已经浏览了一些深层的克隆库源代码();看来他们无法区分。我不能做序列化-反序列化,因为我怀疑它不能解决我的问题。另外,我必须克隆的对象A非常复杂。我几乎参与了这个项目的所有课程。Apache序列化utils处理了上述情况吗?这是不可能的。基本上,Java中没有任何东西允许您确定何时创建给定对象 解决

我的问题是实现对象的克隆。此对象A的成员对象B不是由A创建的。我希望克隆A,以便只克隆在构造A期间创建的对象。在A或A的对象或A的对象的对象中作为引用传递的对象将不被克隆。它们只应被引用


这可能吗?我已经浏览了一些深层的克隆库源代码();看来他们无法区分。我不能做序列化-反序列化,因为我怀疑它不能解决我的问题。另外,我必须克隆的对象A非常复杂。我几乎参与了这个项目的所有课程。Apache序列化utils处理了上述情况吗?

这是不可能的。基本上,Java中没有任何东西允许您确定何时创建给定对象


解决此问题的唯一方法是,如果对象
A
能够保留在其构造函数中创建的成员对象的记录。

您需要手动实现
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;
    }
}
这假设您知道要克隆哪些对象(即,在构建过程中创建哪些对象)