小编典典

标记为“已弃用”的API方法何时真正消失?

java

我正在代码中审查一位同事所做的更改,他添加了对的调用Date.toMonth()Date.toYear()以及其他不赞成使用的Date方法。所有这些方法在JDK
1.1中均已弃用,但他坚持认为可以使用它们,因为它们还没有消失(我们正在使用JDK
1.5),我是说它们可能有一天会消失,他应该使用Calendar方法。

当这些事情消失时,Sun / Oracle是否真的说过,还是@deprecated只意味着您失去了风格点?


阅读 778

收藏
2020-09-21

共2个答案

小编典典

关于API,…未指定它们将很快被删除。

J2SE 5.0中的不兼容(自1.4.2开始)

源兼容性

[…]
通常,该政策如下,但以下列出的不兼容之处除外:

不推荐使用的API是仅支持向后兼容的接口。除非使用-
nowarn命令行选项,否则只要使用其中之一,javac编译器就会生成一条警告消息。建议修改程序,以消除对过时的API的使用, 尽管目前尚无计划
从系统中完全 删除此类API (JVMDI和JVMPI除外)。

即使在其“
如何以及何时弃用API”中,也没有任何关于实际
删除 不赞成使用的API 的政策…


10年后更新,新的JDK9 + 增强 折旧阐明了折旧政策。
有关更多详细信息,请参见 Jens Bannmann的答案
这也是详见本博客文章Vojtěch鲁齐卡,继上JEP
277的批评

JDK的约定是,一旦将JDK API标记为forRemoval=true某个Java版本中的JDK API ,
它将在紧随其后的主要Java版本中将其删除
这意味着-当某些东西forRemoval=true在Java 9中标记为时,应该在Java 10中将其完全删除。
使用标记为删除的API时请记住这一点。

请注意,此约定仅适用于JDK本身,第三方库可以自由选择他们认为合适的任何约定。

2020-09-21
小编典典

tl; dr
从JDK 13开始,所有原始java.util.Date方法仍然存在,但是现在可以将这些API和其他API 明确标记为要删除。最近已删除了许多其他不推荐使用的API。

完整答案
在JDK 9之前,从未删除过JDK中不推荐使用的API。该发行版是称为“ 增强的弃用”功能的一部分,引入了该@Deprecated(forRemoval=true)标志并将其添加到数十个先前弃用的API中。

同样,在该语言的历史上,JDK 9首次删除了由于模块化的障碍而被JDK 8弃用的API(Java SE 9规范的完整列表)。

从那时起,每个JDK版本都删除了其他以前标记为要删除的API。大多数版本还forRemoval向以前不建议使用的API 添加了标志,或者添加了全新的删除要求:

删除了SecurityManager和Runtime类(完整列表)中的一些API 。
forRemoval:其他先前不推荐使用的API,例如整个java.security.acl程序包和finalize()某些I / O类的方法(完整列表)。
删除Thread.destroy()Thread.stop()其他一些方法和Policy类(名单),所有这些已被JDK 9或10提出了去除-分别只有12个和6个月前。
forRemoval:java.util.jar.Pack200API(完整列表)。
仅在12个月前在JDK 10中宣布删除finalize()某些I / O类的方法(完整列表)。
forRemoval: 没有
去除Runtime.traceInstructions()Runtime.traceMethodCalls(),标志着在JDK

9两年前(去除完整列表)。
forRemoval:javax.security.cert包装和其他一些方法。最值得注意的是,完整列表包括java.lang.String此版本中仅添加的几种方法,但是由于它们与“文本块”预览功能有关,可能会再次消失。

Takeaways

不推荐使用的删除API很可能会很快删除。请认真对待。尽管可能无法在forRemoval标记后将其删除(例如,Thread.stop()在JDK 9中标记,但在JDK

  1. 之前未删除),但它可能很快发生。
    没有一个不推荐使用的API是安全的,因为即使很长一段时间不推荐使用的API现在也可以很快删除:一个JDK版本设置了该forRemoval标志,下一个则删除了该API。例如,被JDK

  2. 删除的API已被弃用至少20年(自JDK 1.2起),以至于有些人可能会感到惊讶。
    如今,随着Oracle 使用JDK 10 切换到6个月的发布周期,弃用和删除发生的速度更快。

2020-09-22