应用JDK 9 @不推荐使用的增强功能


我讨论了目前提议的JDK 9 enhancements为了@Deprecated博客帖子中的注释JDK 9 @Deprecated Annotation Enhancements。在这篇文章中,我更详细地介绍了这些次要增强的推荐用法,并演示了关键的Java SE API如何已经具备了这些功能@Deprecated已应用增强功能。

Main的当前版本JEP 277@Deprecated@Deprecated批注[forRemoval()since()]:

  • “一种方法forRemoval()返回一个boolean。如果truefalsefalseforRemoval() boolean元素,如果true,表示打算在项目的某个未来版本中删除API元素。因此,API的用户会得到预先警告,如果他们不从API迁移出去,他们的代码在升级到较新版本时很容易崩溃。如果forRemoval()存在false,这表示建议从已弃用的API迁移,但没有删除该API的任何特定意图。“
  • “名为的方法since()返回String@since包含过时API的项目的Javadoc标记。..。此元素的默认值为空字符串。“

该文本清楚地表明,其目的是能够明确声明是否可能(计划)删除已弃用的元素,或者是否没有计划删除已弃用的元素。对于该弃用元素的客户端来说,这可能是重要的信息,以了解他们需要以何种紧急程度将其对弃用元素的使用更改为不同的元素。

新的JDK 9的应用@DeprecatedJava SE API上的方法还可以指导如何使用它们。关于这一点,JEP 277Page当前声明(我的重点是补充),“几个Java SE API将有一个@Deprecated添加、更新或删除注释。下面列出了一些建议的更改。除非另有说明,否则此处列出的弃用内容不适用于删除。请注意,这不是Java SE 9中不推荐使用的内容的全面列表。还请注意,其中有几项将不会在Java SE 9中实现。“记住这一概述后,我现在将注意力转向当前JDK 9 API文档中的示例,以说明这些概念。

尚未弃用

JEP 277的网页当前列出“Add@Deposated to the Optional.get method(JDK-8160606)“作为”建议的更改“适用的Java SE API之一。deprecating Optional.get()当前与错误相关(JDK-8160606),即使当前的Javadoc文档还没有显示它适用于JDK 9,也不排除它适用于JDK 9。接下来的两个屏幕快照演示了这一点Optional.get()在Java SE 9中尚未弃用。

Java SE 8:Optional.get()介绍

Java SE 9:Optional.get()尚未弃用

已弃用,没有删除计划

JEP 277在其Java SE API列表中包含了对“盒装原语”构造函数的弃用,并在@Deprecation正在处理。接下来的两个屏幕快照演示了JDK 9版本的Boolean确实有新的@Deprecated应用于其构造函数的批注。

Java SE 8:Boolean未弃用的构造函数

Java SE 9:Booleansince=9

值得注意的是,新申请的@Deprecated注释包括一种新方法(since="9"),而不是另一个(未指定forRemoval()。在这种情况下,Boolean除非另有说明,否则应假定Boolean

@Deprecatedsince="9"包括在注释中,以表明它们是用Java SE 9注释的,没有forRemoval()指定(表示false是假定的)。Applet deprecation承保范围为JEP 289(“不建议使用applet API”),它确实声明“添加@Deprecated(since="9")

小程序类@Deprecated从JDK 9开始,但没有forRemoval()

已弃用并计划删除

JDK 9中已弃用并标记为要删除的内容的一个示例是System.runFinalizersOnExit(boolean)。下面的屏幕快照表明此方法在Java SE 8中已被弃用,但它在Java SE 9中的弃用也表明有删除此方法的意图。我还喜欢它传达的信息,即该方法在Java1.2中已弃用。

Java SE 9:不推荐使用的方法通信原始不推荐使用的版本和删除意图

结论

JEP 277是一篇可读性很高的关于当前@Deprecated以及JDK9的次要增强如何至少缓解部分这些不足。尽管JDK9在很多方面都更改为@Deprecated可能会被描述为“小步骤”,但与JDK 9之前的版本相比,它们确实提供了更标准化的工具来传达特定弃用的历史和未来计划。Jep 277中名为“Java SE中的用法”的一节本身很有趣,因为它描述了几个Java SE API(本文只强调了其中的一部分),建议更改其弃用状态或添加有关弃用历史和/或未来计划的更多详细信息。(注:JEP 277中的“Usage in Java SE”一节本身很有趣,因为它描述了几个Java SE API(本文只强调了其中的一个子集),建议更改其弃用状态,或者添加有关弃用历史和/或未来计划的更多详细信息。