这个问题已经有一个答案在这里:

克隆方法vs副本构造。哪一个是正确的解决方案。在那里使用每种情况下?

有帮助吗?

解决方案

克隆被打破了,所以不要使用它。

克隆人的方法的对象类 是有点神奇的方法,不会 什么没有纯粹的Java方法可能永远 这样做:它产生了一个相同的副本 它的对象。它已经存在的 原始的对象超因为 Β-释放天的Java 编译器*;并且,像所有古老的 魔法,需要相应的 咒语,以防止咒语 意外事与愿违

喜欢一个方法,该方法复制对象

Foo copyFoo (Foo foo){
  Foo f = new Foo();
  //for all properties in FOo
  f.set(foo.get());
  return f;
}

阅读更多 http://adtmag.com/articles/2000/01/18/effective-javaeffective-cloning.aspx

其他提示

必须记住, clone() 不工作了。你将得到实施 Cloneable 和复盖 clone() 法制 public.

有几个备选方案,这是优选的(因为 clone() 方法有很多设计问题,正如在其他的答案),并将副本构造,将需要手册的工作:

克隆()设计有几个错误(见 这个问题),因此最好避免它。

有效的Java第2版, 项目11:复盖的克隆谨慎

给所有的相关问题的可复制的,它可以安全地说 其他接口不应延伸,那类 设计用于继承权(项目17)不应该实现它。因 它的许多缺点,一些专家的程序简单地选择不对 复盖的克隆方法,并永远不会调用它,除了,或许, 复制的阵列。如果你设计一个类继承,可以注意,如果 你选择不提供一个良好的保护,克隆方法, 将是不可能的亚类,以实现可复制.

这本书还介绍了许多优势构造复制有可复制/克隆。

  • 他们不依赖的风险,易发生extralinguistic目的创建的机制
  • 他们不需求无法执行遵守薄记录的公约
  • 他们不冲突,与适当使用的最后一场
  • 他们不扔掉不必要的检查的例外情况
  • 他们不需要转换。

所有标准的集有副本的构造.使用它们。

List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original);

牢记,复制构造的限制类型的副本构造。考虑例如:

// Need to clone person, which is type Person
Person clone = new Person(person);

这不起作用,如果 person 可能是一个子类的 Person (或如果 Person 是一个接口)。这是整点的克隆,是可以能克隆的适当类型的动态运行时(假设的克隆,是正确实施).

Person clone = (Person)person.clone();

Person clone = (Person)SomeCloneUtil.clone(person); // See Bozho's answer

现在 person 可以是任何类型的 Person 假设 clone 是正确的执行。

参见: 如何正确地复盖的克隆方法?.克隆被打破,它的 这么辛苦 得到它的权利,即使当它是否 并没有真正提供很多的, ,所以它不是真正值得的麻烦。

伟大的悲伤:不可复制/克隆,也没有一个构造都是伟大的解决方案:我不想知道实现类!!!(例如-我有地图,这是我想要的复制,使用相同的隐藏MumbleMap执行情况)我只是想让一个副本,如果这样做是支持的。但是,可惜的是,可复制没有克隆方法,因此没有什么可以安全地类型铸对其援用克隆().

无论最好的"复制体"库存、Oracle应使它成为一个标准组成部分的下一Java释(除非它已经是,隐藏在某处).

当然,如果有更多的图书馆(例如-藏品)都是不可改变的,这种"复制"的任务只是去走。但是然后我们开始设计Java程序的东西像"类变量",而不是verdammt"豆"模式(使一个破碎的对象和变异,直到良好的[足够的]).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top