objectable_java throwable

objectable_java throwable问题众所周知,Java中的Cloneable接口被破坏了。这有很多原因,我不会提及;others已经做到了。它也是Javaarchitects自己的立场。因此,我的问题是:为什么还没有被弃用?如果核心Java团队已经确定它已被破坏,那么他们也必须考虑弃用。他们这样做的原因是什么(在Java8中它是stillnotdeprecated)?#1热门回答(117赞)在1997年提交的abu…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

问题

众所周知,Java中的Cloneable接口被破坏了。这有很多原因,我不会提及; others已经做到了。它也是Java architects自己的立场。

因此,我的问题是:为什么还没有被弃用?如果核心Java团队已经确定它已被破坏,那么他们也必须考虑弃用。他们这样做的原因是什么(在Java 8中它是still not deprecated)?

#1 热门回答(117 赞)

在1997年提交的abug至Java Bug Database,并且在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接口声明没有方法。

从Java 1.4(2002年2月发布)到当前版本(Java 8),它看起来像这样:

一个类实现了Cloneable接口,以向Object.clone()方法指示该方法合法地为该类的实例创建一个field-for-field副本。在未实现Cloneable接口的实例上调用Object的clone方法会导致抛出异常CloneNotSupportedException。按照惯例,实现此接口的类应使用公共方法覆盖Object.clone(受保护)。有关重写此方法的详细信息,请参阅Object.clone()。请注意,此接口不包含克隆方法。因此,仅仅通过实现该接口的事实来克隆对象是不可能的。即使反射调用clone方法,也无法保证它会成功。

#2 热门回答(63 赞)

简单回答”为什么不是Cloneable贬低?” (或者实际上,为什么not1111428949已经过去,对于任何X而言)是因为对它们的弃用并没有太多关注。

最近弃用的大部分内容都已弃用,因为有一个特定的计划要删除它们。例如,addPropertyChangeListener和removePropertyChangeListener方法LogManagerwevedeprecated in Java SE 8,目的是在Java SE 9中删除它们。(原因是它们不必要地复杂了模块的相互依赖性。)实际上,这些API已经被开发了。 (请注意,类似的属性更改侦听器调用也从Pack200中删除;请参阅JDK-8029806。)

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

更长的答案将涉及讨论进一步的问题,例如人们可能期望在这些API上发生的事情,如果平台被弃用会产生什么样的成本或收益,以及在API被弃用时与开发人员沟通的内容。我在最近的JavaOne演讲Debt and Deprecation中探讨了这个主题。 (在该链接上可用的幻灯片; video here。)事实证明,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之间的变化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182217.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 软件测试流程及规范[通俗易懂]

    软件测试流程及规范[通俗易懂]注:非通用标准流程,仅为大家提供参考。目标制定完整且具体的测试路线和流程,为快速、高效和高质量的软件测试提供基础流程框架。最终目标是实现软件测试规范化、标准化。测试流程说明流程图需求分析需求分析由SA制定,要求细化每一个功能的细节,每一个按钮的位置以及边界范围,对于稍大或稍复杂需求要求建模。(1)测试需求是制订测试计划的基本依据,只有确定了的测试需求才能够为测试计划提供客观依据;(2)测

    2022年6月7日
    32
  • 单片机控制步进电机程序c语言正反转停止,51单片机控制步进电机的启动、停止、正转、反转…

    单片机控制步进电机程序c语言正反转停止,51单片机控制步进电机的启动、停止、正转、反转…51单片机控制步进电机的启动、停止、正转、反转用51单片机控制步进电机的启动、停止、正转、反转、两档速度和状态显示的目的,使步进电机控制更加灵活。步进电机驱动芯片采用ULN2803,ULN2803具有大电流、高电压,外电路简单等优点。利用四位数码管增设电机状态显示功能,各项数据更直观。实测结果表明,该控制系统达到了设计的要求。步进电机的原理图1是一种四相可变磁阻型的步进电机结构示意图。这种电机定子…

    2022年5月31日
    35
  • ICP证书_dwcc2018怎么用

    ICP证书_dwcc2018怎么用输入44 21 2 4 84 0100 99 98 972 210000 100005 30 0 0 0 1696RichmanImpossible代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5 + 10;int a[N];int main(){ int T; cin>>T; while(T -..

    2022年8月11日
    6
  • golang2021.7.20激活码_在线激活

    (golang2021.7.20激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlMLZPB5EL5Q-eyJsa…

    2022年3月21日
    113
  • dom4j Quick start

    dom4j Quick start

    2021年4月28日
    13.0K
  • Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考。由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基本一致! (精读阅读本篇可能花费您15分钟,略读需5分钟左右)Redis主从复制简单介绍为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运…

    2022年2月27日
    57

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号