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

2022-09-01 16:41:40

我正在对我的一位同事刚刚所做的更改进行代码审查,他添加了一堆对 的调用和其他已弃用的方法。所有这些方法在JDK 1.1中被弃用,但他坚持认为使用它们是可以的,因为它们还没有消失(我们正在使用JDK 1.5),我说它们现在可能随时消失,他应该使用方法。Date.toMonth()Date.toYear()DateCalendar

Sun/Oracle是否真的说过这些东西什么时候消失了,或者只是意味着你失去了风格点?@deprecated


答案 1

关于 API,...没有指定它们将很快被删除。

J2SE 5.0 中的不兼容性(自 1.4.2 起):

源兼容性

[...]
一般而言,除下面列出的任何不兼容性外,该政策如下:

已弃用的 API 是仅支持向后兼容的接口。每当使用其中一个时,javac 编译器都会生成一条警告消息,除非使用 -nowarn 命令行选项。建议修改程序以消除已弃用的 API 的使用,尽管目前没有计划从系统中完全删除此类 API(JVMDI 和 JVMPI 除外)。

即使在如何以及何时弃用API中,也没有关于实际删除已弃用API的策略的任何说明...


10 年后的更新中,新的 JDK9+ 增强型弃用明确了折旧策略。
请参阅Jens Bannmann的答案以获取更多详细信息。
Vojtěch Růžička对JEP 277的批评之后的这篇博客文章中也详细介绍了这一点。

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

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


答案 2

他们不会消失。也就是说,它们通常被弃用,因为a)它们是危险的ala Thread.stop(),或者b)有一种更好或至少更被接受的方法可以做到这一点。通常不推荐使用的方法javadoc会给你一个关于更好方法的提示。就您而言,建议使用“日历”来执行此操作。

虽然可以想象它们将在未来的某个时候被删除,但我不会打赌。然而,如果有人分叉Java,他们可能会是第一个要去的地方......