JEP 211:在导入语句中省略弃用警告
概述
从 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 测试以适应更改后的规范。