克隆Java对象

时间:2012-02-29 08:40:51

标签: java

我找到了关于克隆java对象的this answer。但是,在接受答案的方法中,克隆对象是否完全是一个新实例?我的意思是不是真正的链接副本?

我问这个是因为我需要克隆的java对象是一个“全局对象”,它会在某个时间点更新。在某个时间点,我需要“快照”对象并且基本上放在HashMap上。

3 个答案:

答案 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);