注解(五):类型注解和可插拔类型系统

Java SE 8 发布之前,注解只能应用于声明。随着 Java SE 8 发布,注解可以被应用于任何类型使用。这意味着注解可以被用于任何使用类型的地方。类型在什么地方使用的几个例子是类实例创建表达式(new)、强制类型转换、implements 子句和 throws 子句。这种形式的注解称为类型注解,在注解基础中提供了几个例子。

类型注解被创建来增强确保 Java 程序强类型检查的分析方法。Java SE 8 发布版不提供类型检查框架,但允许编写(或下载)类型检查框架,这些框架的实现是作为一个或多个用来与 Java 编译器结合使用的可插拔模块。

例如,想确保程序中的一个常规变量永远不被赋值为 null;避免触发 NullPointerException。可以写一个定制的插件来检查这个。然后修改代码注解那个常规变量,表明它永远不能被赋值为 null。变量声明可能看上去像这样:

@NonNull String str;

当你编译这代码时,在命令行包含 NonNull 模块,如果编译器检测到一个潜在的问题则会打印一个警告,允许你修改代码避免这个错误。改正代码移除所有告警后,这个常规错误不会在程序运行时发生。

可以使用多个类型检查模块,每个模块检查一个不同类型的错误。以这种方式,可以在 Java 类型系统的上层在需要的时候和地方添加指定的检查。

随着明智使用类型注解和可插入类型检查,可以写出更健壮和更少出错的代码。

在很多场景中,没必须写自己的类型检查模块。有第三方已经为你完成了这项工作。例如,你可能想利用华盛顿大学创建的检查框架。这个框架包含一个 NonNull 模块,此外还有一个正则表达式模块,以及一个互斥锁模块。更多信息,参见检查框架