空安全
虽然 Java 不允许你通过其类型系统表达空安全,但 Spring 框架在 org.springframework.lang
包中提供了以下注解,以便让你声明 API 和字段的可空性:
-
@Nullable: 注解用于指示特定参数、返回值或字段可以是
null
。 -
@NonNull: 注解用于指示特定参数、返回值或字段不能是
null
(在适用@NonNullApi
和@NonNullFields
的参数、返回值和字段上不需要)。 -
@NonNullApi: 包级别的注解,声明非空为参数和返回值的默认语义。
-
@NonNullFields: 包级别的注解,声明非空为字段的默认语义。
Spring 框架本身利用了这些注解,但它们也可以在任何基于 Spring 的 Java 项目中使用,以声明安全的 API 和可选的安全字段。对于泛型类型参数、可变参数和数组元素的 nullability 声明尚不支持。nullability 声明预计将在 Spring 框架的版本之间进行微调,包括小版本。方法体内使用的类型的 nullability 超出了此功能的范围。
其他常见的库,如 Reactor 和 Spring Data,提供了使用类似的可空性安排的安全空值 API,为 Spring 应用程序开发人员提供了一致的整体体验。
用例
除了为 Spring Framework API 的可空性提供明确声明外,这些注解还可以被 IDE(如 IDEA 或 Eclipse)使用,以提供与空安全相关的有用警告,从而避免在运行时出现 NullPointerException
。
它们也用于使 Spring API 在 Kotlin 项目中安全地处理 null,因为 Kotlin 原生支持 null-safety。更多详细信息请参见 Kotlin 支持文档。
JSR-305 元注解
Spring 注解使用 JSR 305 注解进行了元注解(这是一个休眠但广泛使用的 JSR)。JSR-305 元注解使得工具供应商如 IDEA 或 Kotlin 能够以通用的方式提供 null 安全支持,而无需为 Spring 注解硬编码支持。
不需要也不推荐在项目类路径中添加 JSR-305 依赖项以利用 Spring 的空安全 API。只有像 Spring 基于的库这样的项目,在其代码库中使用空安全注释时,才应添加 com.google.code.findbugs:jsr305:3.0.2
,并使用 compileOnly
Gradle 配置或 Maven provided
范围,以避免编译器警告。