我找到了关于克隆java对象的this answer。但是,在接受答案的方法中,克隆对象是否完全是一个新实例?我的意思是不是真正的链接副本?
我问这个是因为我需要克隆的java对象是一个“全局对象”,它会在某个时间点更新。在某个时间点,我需要“快照”对象并且基本上放在HashMap上。
答案 0 :(得分:2)
另一个问题中接受的答案简要解释了复制构造函数,是的,这个模式将创建新对象,并且可以(应该!)用于创建这些快照。
新对象将获取原始对象的当前状态。对于字符串和java原语来说这很容易。
对于对象,它更棘手:当前状态是指向另一个对象的指针,如果其他对象发生更改,则更改将反映在快照中。如果你需要避免这种情况,那么你也必须克隆这些对象(深度克隆)。
"问题"通过复制构造函数进行克隆: cloneable 类需要提供这样的构造函数。很简单,如果您拥有源代码 - 那么您可以自己实现它。否则,您可能必须使用Reflection API并实现克隆工厂,这至少是......错误,具有挑战性。
答案 1 :(得分:1)
您必须确定要克隆的深度。 无论如何,这不是真正的克隆。最好是实现Clonable并深度复制任何相关字段。可以引用其他字段对象。
答案 2 :(得分:1)
您可以使用复制构造函数在临时变量中创建对象的克隆。
public class foo {
private int i = 0;
public foo() { this.i = 5; }
public foo(foo orig) { this.i = orig.getI(); }
public getI() { return this.i; }
}
你用它就像:
foo a = new foo();
foo b = new foo(a);