复制构造函数v。实现Cloneable接口

时间:2011-12-27 23:48:33

标签: java copy-constructor deep-copy cloneable

就“最佳实践”而言,哪种方法适用于创建对象的“深层复制”?

2 个答案:

答案 0 :(得分:14)

使用复制构造函数。 Cloneable是一场直接的API灾难。请参阅Effective Java Item 10Item 11 in the 2nd. ed.)。

  

第11项:明智地覆盖clone

     

Cloneable接口用作 mixin接口(第18项),用于宣传允许克隆的对象。不幸的是,它没有达到这个目的。它的主要缺陷是缺少clone方法,并且Object的{​​{1}}方法受到保护。如果不诉诸反射(第53项),则不能仅仅因为它实现clone而在对象上调用clone方法。即使是反射调用也可能会失败,因为无法保证对象具有可访问的Cloneable方法。

答案 1 :(得分:4)

可克隆接口的一般概念没有任何问题。它比API用户的复制构造函数更容易。

Java CloneableObject.clone的问题也不是那么糟糕;他们可以通过一点努力来克服。您可以随时拥有自己的可复制界面。

Java 8可以通过使用默认实现

添加Cloneable方法来修复clone()
interface Cloneable
    public Object clone() default {  return Cloneables.defaultClone(this); }

不确定他们是否有任何计划。