跳到主要内容

JEP 211:在导入语句中省略弃用警告

QWen Max 中英对照

概述

从 Java SE 8 开始,根据对《Java 语言规范》的合理解释,当通过名称导入已弃用的类型,或静态导入已弃用的成员(方法、字段、嵌套类型)时,Java 编译器需要发出弃用警告。这些警告信息并不具备足够的参考价值,因此不应该强制要求。在实际使用已弃用成员的地方,仍然应保留弃用警告。

目标

本 JEP 的目标是帮助大型代码库清除 lint 警告。与代码中对已弃用成员的使用不同,导入时的弃用警告无法通过 @SuppressWarnings 注解来抑制。在像 JDK 这样的大型代码库中,已弃用的功能通常需要在一段时间内继续得到支持,如果对已弃用结构的所有使用都是有意为之并且已被抑制,那么仅仅导入一个已弃用的结构并不足以构成警告信息的理由。

非目标

此 JEP 的目标并非实际解决 JDK 代码库中所有的弃用警告。然而,这可能会作为 JDK 9 中单独维护工作的一部分来完成。

描述

从规范的角度来看,所需的更改很小。在 JLS 8 中关于 @Deprecated 的章节提到:

当使用(重写、调用或通过名称引用)声明中带有 @Deprecated 注解的类型、方法、字段或构造函数时,Java 编译器必须生成一个弃用警告。只要该使用发生在显式或隐式声明的结构中,以下情况除外:

  • 使用发生在一个本身带有 @Deprecated 注解的实体内;或者
  • 使用发生在一个通过注解 @SuppressWarnings("deprecation") 来抑制警告的实体内;或者
  • 使用和声明都位于同一个最外层类之内。

规格变更的内容大致是增加另一项说明额外排除条款的条目:

  • 该用法在 import 语句中。

javac 的参考实现中,会有一个简单的检查,在查找弃用警告时跳过 import 语句。

测试

正常的单元测试应该足以测试此功能。可能需要更新少量 JCK 测试以适应更改后的规范。