当前位置: 首页 > 面试题库 >

为什么不推荐使用Cloneable?

弘和同
2023-03-14
问题内容

众所周知,CloneableJava
中的接口已损坏。造成这种情况的原因很多,我将不再赘述。其他人已经做到了。这也是Java架构师本身的立场。

因此,我的问题是:为什么还不被弃用?如果核心Java团队已确定它已损坏,那么他们还必须考虑过时。他们反对这样做的原因是什么(在Java
8中仍不建议弃用)?


问题答案:

有一个错误在1997年提交给Java的错误数据库有关添加clone()方法Cloneable,所以将不再是无用的。它以“无法解决”的决议关闭,理由如下:

Sun的技术审查委员会(TRC)仔细考虑了此问题,建议不要采取 任何措施,除非改进当前Cloneable接口的文档 。这是建议的全文:

现有的Java对象克隆API存在问题。在java.lang.Object上有一个受保护的“克隆”方法,在接口java.lang.Cloneable中也有。目的是,如果一个类希望允许其他人克隆它,则它应该支持Cloneable接口,并使用公共克隆方法覆盖默认的受保护克隆方法。不幸的是,由于时间的推移,人们很容易迷失时间,因此Cloneable接口没有定义克隆方法。

这种组合导致相当多的混乱。一些类声称支持Cloneable,但偶然忘记支持clone方法。对于Cloneable应该如何工作以及克隆应该做什么,开发人员感到困惑。

不幸的是,向Cloneable添加“克隆”方法将是不兼容的更改。它不会破坏二进制兼容性,但是会破坏源兼容性。轶事证据表明,实际上,在许多情况下,类支持Cloneable接口,但无法提供公共克隆方法。经过讨论,TRC一致建议我们不要修改现有的Cloneable接口,因为它会影响兼容性。

另一种建议是添加一个新接口java.lang.PubliclyCloneable以反映Cloneable的原始预期目的。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接口的实例上调用Object的clone方法会导致抛出CloneNotSupportedException异常。

按照约定,实现此接口的类应使用公共方法重写Object.clone(受保护的)。有关重写此方法的详细信息,请参见Object.clone()。

请注意,此接口不包含clone方法。因此,仅凭对象实现此接口的事实就不可能克隆对象。即使克隆方法是反射式调用的,也不能保证它会成功。



 类似资料:
  • 问题内容: 我曾经在hibernate 3中使用getHibernateTemplate(),现在我转向了Hibernate 4,在这里我找不到以下类: 在这里我已经阅读过有关它的更多信息,不建议使用 http://forum.springsource.org/showthread.php?117227-Missing-Hibernate- Classes-Interfaces-in-spring

  • 问题内容: 我正在将hibernate项目配置为使用第二级缓存提供程序,以便可以利用查询缓存。 我向ehcache添加了一个依赖项: 我认为我要使用的提供程序类是: 在eclipse中查看引用的库时,我在和上都看到了注释。是什么赋予了?我可以使用最新的替代供应商吗? 我正在使用hibernate版本3.4.0.GA,以防万一。 问题答案: 是什么赋予了?我可以使用最新的替代供应商吗? 不推荐使用它

  • 问题内容: 我曾经在hibernate 3中使用getHibernateTemplate(),现在我转向了Hibernate 4,在这里我找不到以下类: 有人可以解释我为什么吗?在hibernate4中,我现在需要执行所有任务,例如提交,关闭,刷新由getHibernateTemplate()方法自动管理的事务? 问题答案: 因为它的主要目的是使Hibernate会话绑定到当前的Spring事务(

  • 问题内容: HTML从早期开始就有框架,但是在最新版本中已弃用。许多浏览器(我曾尝试使用Internet Explorer)甚至无法正确显示框架。 为什么要这样做?镜框的缺点是什么? 问题答案: 雅各布·尼尔森(JakobNielsen)在1996年的专栏批评镜框。一些关键点: 框架会阻止用户正确标记页面。加载带有书签的框架集页面时,用户先前在框架内单击鼠标没有关系。仅保存外部URL,用户必须导航

  • 问题内容: 从Guava 10开始,已弃用,并且中没有对应的方法。 为什么要进行此更改?我需要与使用它的现有代码做什么? 问题答案: 我写这个问题的原因是,起初,我确实确实想知道为什么要这么做(因为我已有使用过的代码)。但是,反思的原因很明显,因此我决定将其发布在这里,以防其他人也使用并想知道同一件事。 简而言之,原因是从一开始就没有任何意义。因此,最初包含它本身就是一个错误,Guava开发人员正

  • 问题内容: (此问题不同于您为什么要实现finalize()?此问题与从Java平台弃用有关,另一个问题与在应用程序中是否应使用此机制有关。) 为什么在Java 9中不推荐使用该方法? 是的,它可能以错误的方式使用(例如,从垃圾收集中保存对象(虽然仅一次)或尝试关闭其中的某些本机资源(总比不完全关闭要好))以及许多其他方法可能会被错误地使用。 那么,是真的如此危险或绝对没有用,有必要将其逐出Jav