Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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 - Fatal编程技术网

克隆Java对象

克隆Java对象,java,Java,我找到了关于克隆java对象的知识。然而,按照公认答案中的方法,克隆对象是否完全是一个新实例?我是说不是真的链接副本 我这样问是因为我需要克隆的java对象是一个“全局对象”,它会在某个时间点更新。在某个时间点,我需要“快照”对象,并将其放在HashMap上 您必须确定要克隆的深度。 无论如何,这不是真正的克隆。最好实现可克隆和深度复制任何相关字段。可以引用其他字段对象。您必须确定要克隆的深度。 无论如何,这不是真正的克隆。最好实现可克隆和深度复制任何相关字段。可以引用其他字段对象。您可以使用复

我找到了关于克隆java对象的知识。然而,按照公认答案中的方法,克隆对象是否完全是一个新实例?我是说不是真的链接副本


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

您必须确定要克隆的深度。
无论如何,这不是真正的克隆。最好实现可克隆和深度复制任何相关字段。可以引用其他字段对象。

您必须确定要克隆的深度。
无论如何,这不是真正的克隆。最好实现可克隆和深度复制任何相关字段。可以引用其他字段对象。

您可以使用复制构造函数在临时变量中创建对象的克隆

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

可以使用复制构造函数在临时变量中创建对象的克隆

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);
另一个问题中的公认答案简要解释了复制构造函数,是的,此模式将创建新对象,并且可以(应该!)用于创建这些快照

新对象将获取原始对象的当前状态。这对于字符串和java原语来说很容易

对于对象来说,这更棘手:当前状态是指向另一个对象的指针,如果其他对象发生更改,这些更改将反映在快照中。如果需要避免这种情况,那么也必须克隆这些对象(深度克隆)

通过复制构造函数进行克隆的“问题”:可克隆类需要提供这样的构造函数。简单,如果您拥有源代码,那么您可以自己实现它。否则,您可能必须使用反射API并实现一个克隆工厂,该工厂至少。。。呃,很有挑战性。

另一个问题中的公认答案简要说明了复制构造函数,是的,此模式将创建新对象,并且可以(应该!)用于创建这些快照

新对象将获取原始对象的当前状态。这对于字符串和java原语来说很容易

对于对象来说,这更棘手:当前状态是指向另一个对象的指针,如果其他对象发生更改,这些更改将反映在快照中。如果需要避免这种情况,那么也必须克隆这些对象(深度克隆)


通过复制构造函数进行克隆的“问题”:可克隆类需要提供这样的构造函数。简单,如果您拥有源代码,那么您可以自己实现它。否则,您可能必须使用反射API并实现一个克隆工厂,该工厂至少。。。呃,很有挑战性。

定义“链接副本”的确切含义。我的意思是,在高级链接副本中,副本具有不同的实例,但当我更改源时,副本会发生变化。我认为正确的术语是“浅层副本”,因此我问题中链接的帖子上的公认答案是浅层副本。这就是我的意思。如果您需要所有实例共享状态,为什么要有多个实例?请定义“链接副本”的确切含义。我的意思是,在高级链接副本中,具有不同实例的副本,但当我更改源时,副本会更改。我认为正确的术语是“浅层副本”,因此,我的问题中链接的帖子上的公认答案是肤浅的。这就是我的意思如果你需要所有的实例来共享状态,为什么有多个实例?我只需要确保源对象的HashMap字段中的对象复制到克隆对象。我只需要确保源对象的HashMap字段中的对象复制到克隆对象。使用这种方法,我需要在副本中键入要复制的每个字段构造器。比如,如果我有100个字段,那么我需要手动复制每个字段?是的,我已经测试过了,Java没有提供默认的复制构造函数。使用这种方法,我需要在复制构造函数中键入要复制的每个字段。比如,如果我有100个字段,那么我需要手动复制每个字段?是的,我已经测试过了,Java没有提供默认的复制构造函数。是的,我可能需要进行深度克隆。是的,我可能需要进行深度克隆。