【问题标题】:Copy constructor v. implementing Cloneable interface复制构造函数 v. 实现 Cloneable 接口
【发布时间】:2012-01-28 20:15:39
【问题描述】:

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

【问题讨论】:

标签: java copy-constructor deep-copy cloneable


【解决方案1】:

可克隆接口的一般概念没有错。对于 API 用户来说,它比复制构造函数更容易。

Java 的CloneableObject.clone 的问题也没有那么严重;稍加努力就可以克服它们。而且您始终可以拥有自己的可克隆界面。

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

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

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

【讨论】:

  • +1 是关于 Java 8 的一个很好的观点。虽然我认为 UnsupportedOperationException 对于没有明确定义 clone() 的对象来说是一个更安全的默认实现.....
【解决方案2】:

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

第 11 项:明智地覆盖 clone

Cloneable 接口旨在作为 mixin 接口(第 18 项),让对象宣传它们允许克隆。不幸的是,它无法达到这个目的。它的主要缺陷是缺少clone 方法,而Objectclone 方法受到保护。如果不借助 reflection(第 53 项),您不能仅仅因为它实现了 Cloneable 而对对象调用 clone 方法。即使是反射调用也可能失败,因为无法保证对象具有可访问的 clone 方法。

【讨论】:

  • +1(主要用于链接)但是 Cloneable 的其他替代品呢? (复制构造函数通常需要一个已知的具体类型,虽然通常非常好,但与 Cloneable 不同。)
  • 这句话似乎也与这个问题有关:“实际上,clone 方法充当另一个构造函数;您必须确保它不会损害原始对象,并且它正确地在克隆上建立不变量"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2017-12-26
相关资源
最近更新 更多