用Java克隆

amu*_*u61 14 java

我从互联网上读到了一段关于克隆的内容.但是我不太明白,所以有人可以清楚地解释清楚吗?

如果类具有final字段,则无法在clone方法中为这些字段指定值.这会导致正确初始化对象的最终字段时出现问题.如果最后一个字段指的是对象的某个内部状态,那么克隆的对象最终会共享内部状态,这对于可变对象肯定是不正确的.

供参考,这里是链接:http: //www.jusfortechies.com/java/core-java/cloning.php

Dav*_*Far 19

简而言之

  • o.clone()调用Object.clone(),它的内存副本o.此后,复制的引用不能更改为最终字段,因此我们有非自愿的别名;
  • 不必要的别名和可变性彼此不顺利:如果o发生变化,克隆也会不由自主地改变;
  • 你引用的博客文章中的陈述是从这篇更好的博客文章中复制而来的,这篇文章通过良好的代码示例来证明这些陈述.

有关通过`Object.clone()'进行克隆的详细信息和示例

我相信这篇文章是clone()通过clone-chaining(via super.clone())讨论的,最终Object.clone()被调用,这使得通过本机代码克隆的对象的平面内存副本.

假设我们有以下示例(来自下面提到的博客文章):

public class Person implements Cloneable
{
    private final Brain brain; // brain is final since I do not want 
                // any transplant on it once created!
        // ...
}
Run Code Online (Sandbox Code Playgroud)

person2 = (Person) person1.clone();
Run Code Online (Sandbox Code Playgroud)

然后,person2与field1具有相同的字段大脑内存部分,即两者对同一个大脑具有相同的引用.然后,由于Person对象是可变的,他们可以学习东西:

person1.learn(dvorakTyping);
Run Code Online (Sandbox Code Playgroud)

然后神奇地,person2也可以在dvorak键盘上输入.对于不可变对象,这个问题不会发生(尽管克隆仍然存在问题,因为最终字段仍然无法通过参数初始化,如在构造函数中).

通过构造函数调用克隆

我上半句的原因是:你可以通过调用对象的一个​​构造函数来实现clone.有些人声称这是违反克隆合同的,但事实并非如此.这是一篇很好的博客文章,讲述为什么要在克隆中调用构造函数(一个主要原因是那些最终字段).


更新

阅读Hemal对mre答案的评论,我瞥了一眼博客文章引用的问题,事实证明,该帖子复制了我引用的博客文章中的一些句子,但没有很好的代码示例.大声笑.


Mis*_*ble 0

我也不明白,除了如果类的clone所有字段都没有行为良好的方法,则该类无法实现行为良好的clone方法。