Skip to content

JEP 211: Elide Deprecation Warnings on Import Statements | 消除导入语句上的过时警告

摘要

从 Java SE 8 开始,合理解释 Java 语言规范要求的情况下,当通过名称导入已弃用类型或者静态导入已弃用成员(方法、字段、嵌套类型)时,Java 编译器将发出已弃用警告。这些警告毫无意义,并且不应该是必需的。在实际使用已弃用成员的地方仍然应保留已弃用警告。

目标

此 JEP 的目标是帮助使大型代码库摆脱冗余警告。与代码中使用的已弃用成员不同,无法使用 @SuppressWarnings 注解来抑制导入时的已弃用警告。在像 JDK 这样的大型代码库中,已弃用的功能通常必须在一段时间内得到支持,仅仅导入一个已弃用的结构并不意味着需要警告,只要所有使用已弃用结构的情况都是故意的并且被抑制了。

非目标

本 JEP 的目标不是实际解决 JDK 代码中的所有已弃用警告。然而,在 JDK 9 中可能会作为单独维护工作的一部分进行解决。

描述

从规范的角度来看,需要的更改很小。在 JLS 8 中,关于 @Deprecated 的部分如下所述:

当声明了注解为 @Deprecated 的类型、方法、字段或构造函数被在一个明确或隐式声明的结构中使用(重写、调用或通过名称引用),Java 编译器必须产生一个已弃用警告,除非:

  • 使用在自身被注解为 @Deprecated 的实体中;或
  • 使用在使用 @SuppressWarnings("deprecation") 注解抑制警告的实体中;或
  • 使用和声明都在同一个最外层类中。

规范的更改将是在末尾添加另一个排除项:

  • 使用在 import 语句中。

javac 的参考实现中,只需添加一个简单的检查来跳过导入语句,以及在寻找已弃用警告时进行处理。

测试

正常的单元测试应该足以测试此功能。一些 JCK 测试可能需要根据更改的规范进行更新。