人们普遍认为Cloneable
Java 中的接口已损坏。造成这种情况的原因有很多,我就不一一列举了;others http://howtodoinjava.com/2012/11/10/cloneable-interface-is-broken-in-java/已经做了。这也是Java架构师 http://www.artima.com/intv/bloch13.html他们自己。
因此,我的问题是:为什么还没有被弃用?如果核心 Java 团队认为它已被破坏,那么他们也必须考虑过弃用。他们反对这样做的理由是什么(在 Java 8 中是仍未弃用 http://docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html)?
有一个bug http://bugs.java.com/bugdatabase/view_bug.do?bug_id=40980331997年提交给Java 错误数据库 http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4098033关于添加clone()
方法Cloneable
,这样它就不再是无用的了。它以“不会修复”的决议结束,理由如下:
Sun 的技术审查委员会 (TRC) 详细考虑了这个问题
并建议不要服用除了改进以外的任何行动
当前 Cloneable 接口的文档。这是完整的
建议案文:
现有的 Java 对象克隆 API 存在问题。有一个
java.lang.Object 上受保护的“克隆”方法并且有一个接口
java.lang.Cloneable。目的是如果一个类想要允许
其他人克隆它,那么它应该支持 Cloneable
接口并覆盖默认的受保护克隆方法
公共克隆方法。不幸的是,由于各种原因很容易迷失在
时间的长河中,Cloneable接口并没有定义克隆
方法。
这种组合会导致相当多的混乱。部分课程
声称支持Cloneable,却一不小心忘记支持
克隆方法。开发人员对 Cloneable 的含义感到困惑
工作以及克隆应该做什么。
不幸的是,向 Cloneable 添加“克隆”方法将是一个
不相容的改变。它不会破坏二进制兼容性,但会
破坏源兼容性。轶事证据表明,在
实践中,有许多案例支持课程
可克隆接口,但无法提供公共克隆方法。后
经过讨论,TRC 一致建议我们不要修改
现有的Cloneable接口,因为兼容性影响。
另一种建议是添加一个新界面
java.lang.PubliclyCloneable 反映最初的预期目的
可克隆的。 TRC 以 5 比 2 的多数反对这一决定。
主要担心的是这会增加更多混乱(包括
拼写混乱!)到一张已经混乱的图片。
TRC 一致建议我们应该增加额外的
现有 Cloneable 接口的文档为了更好地描述
如何使用它并描述“最佳实践”
实施者。
所以,虽然这不是直接关于已弃用,不让 Cloneable “弃用”的原因是技术审查委员会决定修改现有文档就足够了使这个界面有用。他们也确实这么做了。直到Java 1.4,Cloneable
记录如下:
一个类实现了 Cloneable 接口来指示
Object.clone() 方法,该方法创建一个对象是合法的
该类实例的逐字段副本。
尝试克隆未实现 Cloneable 的实例
接口导致异常 CloneNotSupportedException
抛出。
Cloneable 接口没有声明任何方法。
从 Java 1.4(2002 年 2 月发布)到当前版本(Java 8),它看起来像这样:
一个类实现了 Cloneable 接口来指示
Object.clone() 方法,该方法创建一个对象是合法的
该类实例的逐字段副本。调用对象的
未实现 Cloneable 的实例上的克隆方法
接口导致异常 CloneNotSupportedException
抛出。
按照惯例,实现此接口的类应该重写
使用公共方法的 Object.clone(受保护)。看
Object.clone() 了解有关重写此方法的详细信息。
请注意,该接口不包含clone方法。所以,
仅凭以下事实不可能克隆对象
它实现了这个接口。即使调用了clone方法
仔细想想,并不能保证它会成功。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)