Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
在 Java SE 8 发行版之前,注解只能应用于声明。从 Java SE 8 发行版开始,注解也可以应用于任何 类型使用。这意味着可以在任何使用类型的地方使用注解。使用类型的一些示例是类实例创建表达式(new
),类型转换,implements
子句和 throws
子句。这种形式的注解称为 type annotation (类型注解),并在 Annotations Basics 中提供了几个示例。
创建类型注解是为了支持改进的 Java 程序分析,以确保更强的类型检查。Java SE 8 版本不提供类型检查框架,但它允许你编写(或下载)类型检查框架,该框架实现为与 Java 编译器结合使用的一个或多个可插入模块。
例如,你希望确保程序中的特定变量永远不会分配给 null;你想避免触发 NullPointerException
。你可以编写自定义插件来检查此问题。然后,你将修改代码以注解该特定变量,表明它从未分配给 null。变量声明可能如下所示:
@NonNull String str;
当你在命令行编译代码(包括 NonNull
模块)时,编译器会在检测到潜在问题时输出警告,允许你修改代码以避免错误。在更正代码以移除所有警告后,程序运行时不会发生此特定错误。
你可以使用多个类型检查模块,其中每个模块检查不同类型的错误。这样,你可以在 Java 类型系统的顶部构建,并在需要的时候和特定的地方添加特定的检查。
通过明智地使用类型注解和可插入类型检查器的存在,你可以编写更强大且更不容易出错的代码。
在许多情况下,你不必编写自己的类型检查模块。有第三方为你完成了这项工作。例如,你可能希望利用华盛顿大学创建的 Checker Framework。该框架包括 NonNull
模块,以及正则表达式模块和互斥锁模块。有关更多信息,请参阅 Checker Framework。