首页 > 编程知识 正文

final和abstract不能同时使用,finalize方法在垃圾回收时被执行

时间:2023-05-06 09:55:15 阅读:111342 作者:623

问题

正如您所知,Java的Cloneable接口被破坏了。 这有很多理由,我就不提了; others已经做了。 也是Java architects自己的立场。

所以,我的问题是,为什么还没有被抛弃? 如果确定核心Java团队被破坏,还应考虑销毁。 他们这样做的理由是什么?

#1人气回答(117赞词) ) ) ) ) ) ) ) ) ) ) ) ) )1) ) ) ) )

1997年提交的abug被传递到Java bug数据库,并在Cloneable中添加了clone ()方法,因此不再浪费。 那个以“不修复”的决议结束。 理由如下。

Sun的技术审查委员会(TRC )建议仔细研究此问题,不要改进当前的Cloneable接口文档,而是采取任何措施。 以下是推荐的全文。 现有的Java对象克隆API存在问题。 java.lang.Object具有受保护的“clone”方法和接口java.lang.Cloneable。 其目的是,如果一个类希望允许其他人进行克隆,则支持Cloneable接口,并使用公共克隆方法复盖默认的受保护克隆方法。 遗憾的是,Cloneable接口没有定义克隆方法,因为它很容易在时间的迷雾中丢失。 这个组合导致了相当大的混乱。 虽然有些类声称支持Cloneable,但是他们忘记了支持克隆方法。 开发者对Cloneable应该如何工作以及克隆应该做什么感到困惑。 遗憾的是,向Cloneable添加“克隆”的方式将发生不兼容的更改。 二进制兼容性不会受损,但源代码兼容性会受损。 根据逸闻,实际上很多类都支持Cloneable接口,但无法提供公共克隆方法。 经过讨论,TRC建议由于兼容性的影响,不要修改现有的Cloneable接口。 另一个建议是添加新接口java.lang.PubliclyCloneable,以反映Cloneable的初衷。 因为5比2很多,所以TRC建议不要这样做。 主要担心的是对已经混乱的图像增加混淆(请参阅)。 TRC建议在现有的Cloneable接口中添加其他文档,以更好地说明其使用方法,并向实现者说明“最佳实践”。

因此,这与不建议的情况并无直接关系,但不进行Cloneable '废弃'的理由是,技术审查委员会可以通过修改现有文档的4669681446来启用此接口所以他们做了。 到Java 1.4为止,Cloneable记录如下。

该类实现Cloneable接口,并指示Object.clone )方法合法创建该类实例的field-for-field副本。 如果尝试克隆未实现Cloneable接口的实例,则会抛出CloneNotSupportedException异常。 Cloneable接口声明没有办法。

从Java1.4(2002年2月发行版)到当前发行版(Java 8),它看起来是这样的。

该类实现Cloneable接口,并指示Object.clone )方法合法创建该类实例的field-for-field副本。 如果在未实现Cloneable接口的实例上调用Object的clone方法,则会抛出异常CloneNotSupportedException。 按照惯例,实现此接口的类必须使用公共方法覆盖Object.clone (受保护的)。 有关重写此方法的详细信息,请参见Object.clone ()。 请注意,此接口不包含克隆方法。 因此,仅凭实现该接口的事实克隆对象是不可能的。 以反射方式调用clone方法并不保证它会成功。

#2人气回答(63赞) ) ) ) ) ) ) ) ) ) ) ) ) )0)

简单的回答'为什么不是Cloneable?' (或者实际上,为什么not1111428949过去了,对任何x来说)因为我不太关心它们的丢弃。

最近销毁的大部分内容都是因为有要删除的特定计划而被销毁的。 例如,addPropertyChangeListener和removePropertyChangeListener方法的logmanagerwevedeprecatedinjavase 8旨在通过Java SE 9删除(原因是它不必要地使模块的相互依赖性变得复杂。 )实际上,这些API已经开发出来了。 (请注意,类似的属性更改侦听器调用也将从Pack200中删除; 请参见JDK-8029806。 )

关于Cloneable和Object.clone (),没有类似的计划。

更长的答案包括讨论进一步的问题,例如这些API中发生的事情、平台废弃时会产生什么成本或收益、API废弃时与开发人员交流的内容等。 在最近的JavaOne演讲Debt and Deprecation中讨论了这个主题。 (此链接上可用的幻灯片; 视频标题。 )事实证明,JDK本身在放弃使用方面并不十分一致。 它被用来表示几种不同的东西。 例如,

这很危险。 应该知道使用它的风险,例如Thread.stop (、Thread.resume )、Thread.suspend )。

这将在以后的版本中删除

这个已经旧了,你最好用别的。 (例如,java.util.Date中的许多方法)。

所有这些都是不同的含义,它们的不同子集适用于不推荐使用的不同内容。它们的一些子集适用于未弃用的东西(但可能应该弃用)。

Cloneable和Object.clone()在它们有设计缺陷并且难以正确使用的意义上是"破碎的"。但是,clone()仍然是复制数组的最佳方法,而克隆对于精心实现的类实例的副本有一些有限的用处。删除克隆将是一个不兼容的变化,会破坏很多东西。克隆操作可以以不同的方式重新实现,但它可能比Object.clone()慢。

但是,对于大多数情况,复制构造函数优于克隆。所以也许将Cloneable标记为"过时"或"被取代"或类似的东西是合适的。这将告诉开发人员他们可能想要寻找其他地方,但它不会表明在将来的版本中可能会删除克隆机制。不幸的是,不存在这样的标记。

事实上,"弃用"似乎意味着最终被删除 - 尽管事实上已经删除了少量被弃用的功能 - 因此克隆机制似乎不值得推荐。也许将来可以应用替代标记,指导开发人员使用替代机制。

更新

我已经为bug report添加了一些额外的历史记录。早期的JVM实现者和JVM规范的共同作者Frank Yellin在other answer引用的TRC建议中回应了"迷失在时间之中"的评论。我在这里引用了相关部分;完整的消息在错误报告中。

Cloneable没有方法与Serializable没有相同的原因。 Cloneable表示类的属性,而不是具体说明该类支持的方法。在反射之前,我们需要一个本机方法来制作一个Object的浅表副本。因此,Object.clone()诞生了。很明显,许多类都希望覆盖此方法,并且不是每个类都希望克隆。因此Cloneable的诞生是为了表明程序员的意图。所以,简而言之。 Cloneable的目的不是表明你有一个公共clone()方法。这表明你愿意使用Object.clone()进行克隆,并且由实现决定是否公开clone()。

#3 热门回答(-1 赞)

为什么它不被弃用了?

因为JCP认为不适合这样做,并且可能永远不会这样做。问他们。你在错误的地方问。

在Java API中保留此内容的原因是什么?

由于向后兼容性要求,没有人会从Java API中删除任何内容。最后一次发生的是1996/7年间AWT事件模型在1.0和1.1之间的变化。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。