就“最佳实践”而言,哪种方法适用于创建对象的“深层复制”?
答案 0 :(得分:14)
使用复制构造函数。 Cloneable
是一场直接的API灾难。请参阅Effective Java Item 10(Item 11 in the 2nd. ed.)。
第11项:明智地覆盖
clone
Cloneable
接口用作 mixin接口(第18项),用于宣传允许克隆的对象。不幸的是,它没有达到这个目的。它的主要缺陷是缺少clone
方法,并且Object
的{{1}}方法受到保护。如果不诉诸反射(第53项),则不能仅仅因为它实现clone
而在对象上调用clone
方法。即使是反射调用也可能会失败,因为无法保证对象具有可访问的Cloneable
方法。
答案 1 :(得分:4)
可克隆接口的一般概念没有任何问题。它比API用户的复制构造函数更容易。
Java Cloneable
和Object.clone
的问题也不是那么糟糕;他们可以通过一点努力来克服。您可以随时拥有自己的可复制界面。
Java 8可以通过使用默认实现
添加Cloneable
方法来修复clone()
interface Cloneable
public Object clone() default { return Cloneables.defaultClone(this); }
不确定他们是否有任何计划。