【发布时间】:2012-01-28 20:15:39
【问题描述】:
就“最佳实践”而言,哪种方法更适合创建对象的“深层副本”?
【问题讨论】:
标签: java copy-constructor deep-copy cloneable
就“最佳实践”而言,哪种方法更适合创建对象的“深层副本”?
【问题讨论】:
标签: java copy-constructor deep-copy cloneable
可克隆接口的一般概念没有错。对于 API 用户来说,它比复制构造函数更容易。
Java 的Cloneable 和Object.clone 的问题也没有那么严重;稍加努力就可以克服它们。而且您始终可以拥有自己的可克隆界面。
Java 8 可以通过添加带有默认实现的 clone() 方法来修复 Cloneable
interface Cloneable
public Object clone() default { return Cloneables.defaultClone(this); }
不确定他们是否有这样做的计划。
【讨论】:
UnsupportedOperationException 对于没有明确定义 clone() 的对象来说是一个更安全的默认实现.....
使用复制构造函数。 Cloneable 是直接的 API 灾难。请参阅Effective Java Item 10 (Item 11 in the 2nd. ed.)。
第 11 项:明智地覆盖
clone
Cloneable接口旨在作为 mixin 接口(第 18 项),让对象宣传它们允许克隆。不幸的是,它无法达到这个目的。它的主要缺陷是缺少clone方法,而Object的clone方法受到保护。如果不借助 reflection(第 53 项),您不能仅仅因为它实现了Cloneable而对对象调用clone方法。即使是反射调用也可能失败,因为无法保证对象具有可访问的clone方法。
【讨论】: