我正在代码审查我的一个同事刚刚做的更改,并且他添加了一堆调用Date.toMonth()
,Date.toYear()
以及其他已弃用的Date
方法.所有这些方法都在JDK 1.1中被弃用了,但他坚持认为可以使用它们因为它们还没有消失(我们使用的是JDK 1.5)而且我说它们现在可能会在任何一天消失而且他应该使用它们Calendar
方法.
Sun/Oracle实际上是在说这些事情何时消失,还是@deprecated
仅仅意味着你失去了风格点?
关于API,......未指定它们将很快被删除.
J2SE 5.0中的不兼容性(从1.4.2开始):
源兼容性
[...]
一般而言,该政策如下,但下列进一步列出的任何不兼容性除外:不推荐使用的API是仅支持向后兼容性的接口.除非使用-nowarn命令行选项,否则只要使用其中一个,javac编译器就会生成警告消息.建议修改程序以消除使用已弃用的API,尽管目前没有计划删除此类API(JVMDI和JVMPI除外) - 完全来自系统.
即使在其如何以及何时废弃API中,关于实际删除已删除的API 的策略也没有任何说明......
10年后更新,新的JDK9 + Enhanced Deprecation澄清了折旧政策.
有关详细信息,请参阅 Jens Bannmann的答案.
这也是详见本博客文章Vojtěch鲁齐卡,继上JEP 277的批评.
JDK的约定是,一旦JDK API被标记为
forRemoval=true
某个Java版本,它将在以下主要Java版本中被删除.
这意味着 - 当forRemoval=true
在Java 9中标记某些内容时,它应该在Java 10中被完全删除.
在使用标记为删除的API时请记住这一点.请注意,此约定仅适用于JDK本身,第三方库可以自由选择他们认为合适的任何约定.
他们不会离开.也就是说,它们通常被弃用,因为a)它们是危险的线程.stop(),或b)有更好的或至少更可接受的方式来做它.通常不推荐使用的方法javadoc会给你一个更好的方法提示.在您的情况下,建议使用日历来执行此操作.
虽然可以想象他们将来会在某些时候被删除,但我不会赌它.如果有人曾经问过Java,他们可能是第一件事......
一个问题是你会看到许多关于使用弃用方法的编译器警告.如果您还使用弃用逐步淘汰自己的代码,编译器警告将在噪声中丢失并失去意义.
从JDK 10开始,所有原始java.util.Date
方法仍然存在,但是现在可以将这些API和其他API 明确标记为要删除。其他API最近已被删除。
在Java 9之前,没有删除JDK中已弃用的API(请参阅Java弃用20年)。
但是,作为称为“ Enhanced Deprecation”功能的一部分,JDK 9引入了该@Deprecated(forRemoval=true)
标志并将其添加到数十个先前不推荐使用的API中。java.util.Date
但是,方法并不在其中。
同样,这是该语言历史上的第一次,JDK 9 删除了以前不推荐使用的API(如Java SE 9 Specification中所述)。这些是模块化的障碍,在JDK 8中已弃用。
JDK 10 将更多以前不推荐使用的API标记为要删除。再一次地,java.util.Date
方法得以保留。
JDK 10还删除了SecurityManager
和Runtime
类中的一些不赞成删除的API (如Java SE 10 Specification中所述)。
因此,要点是:
不推荐使用的删除API很可能会很快删除。请认真对待。虽然可能无法在forRemoval
标记后的发行版中将其删除(例如,Thread.stop()
在JDK 9中标记,但仍在JDK 10中),但它可能很快发生。
没有一个不推荐使用的API是安全的,因为即使很长一段时间不推荐使用的API现在也可以很快删除:一个JDK版本设置了该forRemoval
标志,下一个则删除了该API。例如,被JDK 10删除的API已被弃用至少20年(自JDK 1.2起),以至于有些人现在可能会感到惊讶。
随着Oracle 六个月的新发布周期的发展,JDK的发布以及扩展(即,过时和删除)现在的发生速度要快得多。