20220507 Core - 7. Null-safety
前言
尽管 Java 不允许您通过其类型系统表达 null 安全性,但 Spring 框架在 org.springframework.lang
包中提供了以下注解,让您可以声明 API 和字段的可空性:
@Nullable
:表示特定 参数、返回值或字段 可以是null
@NonNull
:用于指示特定 参数、返回值或字段 不能为null
(已经使用了@NonNullApi
和@NonNullFields
的参数/返回值和字段不需要使用此注解)@NonNullApi
:包级别的注解,将非空声明为 参数 和 返回值 的默认语义@NonNullFields
:包级别的注解,将非空声明为 字段 的默认语义
Spring Framework 本身利用了这些注解,但它们也可以用于任何基于 Spring 的 Java 项目来声明空安全的 API 和可选的空安全字段。尚不支持 泛型类型参数、可变参数和数组元素 可空性。方法体内使用的类型的可空性超出了功能范围。
其他常用库(如 Reactor 和 Spring Data)提供使用类似可空性安排的空安全 API。
用例
除了为 Spring Framework API 可空性提供显式声明之外,IDE(例如 IDEA 或 Eclipse)可以使用这些注解来提供与空安全相关的有用警告,以避免在运行时发生 NullPointerException
。
JSR-305 元注解
Spring 注解使用 JSR 305 注解进行元注解。JSR-305 元注解让 IDEA 或 Kotlin 等工具供应商以通用方式提供空安全支持,而无需对 Spring 注解进行硬编码支持。
不建议将 JSR-305 依赖项添加到项目类路径以利用 Spring 空安全 API。只有基于 Spring 的库的项目,在他们的代码库使用空安全注解应该增加 com.google.code.findbugs:jsr305:3.0.2
与 compileOnly
Gradle 配置或 Maven provided
作用域,以避免编译警告。