就“最佳实践”而言,哪种方法更适合创建对象的“深层副本”?
问问题
2034 次
2 回答
14
使用复制构造函数。Cloneable
是直接的 API 灾难。请参阅Effective Java Item 10(第 2 版中的 Item 11)。
clone
第 11 项:明智地覆盖该
Cloneable
接口旨在作为一个mixin 接口(第 18 项),以便对象宣传它们允许克隆。不幸的是,它无法达到这个目的。它的主要缺陷是缺少clone
方法,而Object
' 的clone
方法受到保护。如果不借助反射(第 53 条),您不能clone
仅仅因为它实现了对象就调用该方法Cloneable
。即使是反射调用也可能失败,因为不能保证对象具有可访问的clone
方法。
于 2011-12-27T23:50:59.257 回答
4
可克隆接口的一般概念没有错。它比 API 用户的复制构造函数更容易。
Java的问题Cloneable
也不Object.clone
是那么糟糕;稍加努力就可以克服它们。而且您始终可以拥有自己的可克隆界面。
Cloneable
Java 8 可以通过添加clone()
具有默认实现的方法来修复
interface Cloneable
public Object clone() default { return Cloneables.defaultClone(this); }
不确定他们有没有这样做的计划。
于 2011-12-28T03:22:38.170 回答