1997年有人向Java Bug Database提交了一个关于在Cloneable
中添加clone()
方法的bug,以使其不再无用。它被关闭并标记为“不修复”,原因如下:
clone
方法最初会在Object
中吗? - njzk2Object#clone()
方法会产生一个与原始实例相同类的新实例,但该类在编译时是未知的。 - Marko TopolnikCloneable
没有被弃用?"(或者为什么任何X
都没有被弃用?)的简短回答是,很少有人关注废弃它们。最近被废弃的大多数东西之所以被废弃,是因为有一个具体的计划要将它们移除。例如,LogManager的addPropertyChangeListener
和removePropertyChangeListener
方法在Java SE 8中已经被废弃,并计划在Java SE 9中将其移除。(原因是它们不必要地复杂了模块间的依赖关系。)事实上,这些API已经从早期的JDK 9开发构建中被移除。(请注意,类似的属性更改监听器调用也已从Pack200
中删除;请参见JDK-8029806。)"这很危险,你应该意识到使用它的风险(例如:Thread.stop()
、Thread.resume()
和Thread.suspend()
)。
这将在未来的版本中移除。
这已经过时了,最好使用其他东西(例如:java.util.Date
中的许多方法)。
所有这些都是不同的含义,并且不同的子集适用于被弃用的不同事物。其中某些子集适用于未被弃用的事物(但也许应该被弃用)。
Cloneable
和Object.clone()
在设计上存在缺陷,难以正确使用,因此可以说是“有问题的”。然而,clone()
仍然是复制数组的最佳方式,并且克隆在一定程度上有用,可以复制小心实现的类的实例。删除克隆将是一项不兼容的更改,会破坏很多东西。可以用不同的方式重新实现克隆操作,但它可能比Object.clone()
慢。
Cloneable
标记为“已过时”或“已被取代”或类似的内容可能是合适的。这会告诉开发人员他们可能需要寻找其他替代方案,但不会表明克隆机制可能会在未来的版本中删除。不幸的是,没有这样的标记存在。
目前的情况是,“弃用”似乎意味着最终会被删除--尽管极少量的弃用功能曾经被删除--因此,克隆机制似乎不应该被弃用。也许在将来可以应用另一种标记,指导开发人员使用替代机制。
更新
我在错误报告中添加了一些额外的历史。Frank Yellin是早期JVM实现者之一,也是JVM规范的合著者,在其他答案中引用了TRC建议中的“遗失在时间的雾中”的评论,并对其进行了一些评论。以下是相关部分的引用;完整信息请参阅错误报告。
Cloneable没有方法的原因和Serializable一样。Cloneable表示类的属性,而不是具体支持哪些方法。Object.clone()
,而是愿意进行推理并提出其好处。 - iczaarray.clone()
并不一定比其他任何替代方法更快。从API的角度来看,这是复制数组最简洁的方式。Arrays.copyOf(array, newlen)
接近于它,但需要一个长度参数,如果您不改变长度,则该参数是多余的。 - Stuart MarksThread.suspend()
和Thread.stop()
(无参)是危险的,它们可能不会被删除--或者改为无条件抛出异常--因为人们实际上在使用它们!大概他们愿意承担风险。属性更改侦听器的缓解因素之一是它们很少被使用,因此删除它们的影响很小。 - Stuart Marksjava.beans
库API只是一个属性的库,因此可以使其与 java.desktop
无关。可惜的是,如果深入研究 beans API
就会发现有很多对 AWT
的依赖。实现甚至更多。当然,可能有可能将它们分离出来,但做到这一点似乎比例如将记录与bean解脱出来要困难得多。整个模块化工作的目的就在于进行这种解脱操作。毫无疑问,还可以做更多的工作,但那样做会使 Jigsaw 花费更长时间。 - Stuart MarksThread.stop(Throwable)
的契约以始终向调用者(而不是目标线程)抛出 UnsupportedOperationException
来有效地删除了它。请注意,这并不意味着它已从语言中完全消失。 - Marko TopolnikThread.stop(Throwable)
的功能。无论如何,“去问他们”的不合格建议是错误的,因为如今首席 Java 架构师本人是 Stack Overflow 上的活跃成员。他只是碰巧只回答与 Streams 相关的问题而已。 - Marko TopolnikCloneable
是否会从Java API中删除。我在问为什么它不会被弃用。我认为这是一个很好的询问地点。 - Kao
Cloneable
的批评是广为人知的。 - Marko Topolnik