5

就“最佳实践”而言,哪种方法更适合创建对象的“深层副本”?

4

2 回答 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是那么糟糕;稍加努力就可以克服它们。而且您始终可以拥有自己的可克隆界面。

CloneableJava 8 可以通过添加clone()具有默认实现的方法来修复

interface Cloneable
    public Object clone() default {  return Cloneables.defaultClone(this); }

不确定他们有没有这样做的计划。

于 2011-12-28T03:22:38.170 回答