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