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 测试可能需要根据更改的规范进行更新。