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