Null-safety
尽管 Java 无法让你用其类型系统表示空安全性,但 Spring Framework 提供了 org.springframework.lang
包中的以下注释,让你声明 API 和字段的空值性:
-
@Nullable
:表示特定参数、返回值或字段可以是 `null`的注释。 -
@NonNull
:表示某个特定参数、返回值或字段不能是 `null`的注释(对于 `@NonNullApi`和 `@NonNullFields`分别适用的参数、返回值和字段不需要)。 -
@NonNullApi
:一个包级别的注释,将非空声明为参数和返回值的默认语义。 -
@NonNullFields
:一个包级别的注释,将非空声明为字段的默认语义。
Spring Framework 本身利用了这些注释,但它们也可以在任何基于 Spring 的 Java 项目中使用,以声明 null 安全 API 和可选的 null 安全字段。暂不支持泛型类型参数、变长参数和数组元素的空值声明。预计空值声明将在 Spring Framework 的版本之间进行微调,包括次要版本。方法体中使用的类型的空值不在此功能的范围内。
其他常见库(如 Reactor 和 Spring Data)提供了使用类似空值安排的空安全 API,为 Spring 应用程序开发人员提供了始终如一的整体体验。 |
Use cases
除了为 Spring Framework API 空值提供明确的声明之外,这些注释还可由 IDE(如 IDEA 或 Eclipse)使用,以提供有关 null 安全性的有用警告,从而避免在运行时出现 NullPointerException
。
它们还用于在 Kotlin 项目中使 Spring API 具有 null 安全性,因为 Kotlin 本机支持 null 安全性。更多详细信息可在 Kotlin 支持文档中找到。
JSR-305 meta-annotations
Spring 注释使用 https://www.jcp.org/en/jsr/detail?id=305 注释(一种休眠但广泛使用的 JSR)进行元注释。JSR-305 元注释允许诸如 IDEA 或 Kotlin 的工具供应商以通用方式提供 null 安全支持,而无需为 Spring 注释硬编码支持。
不必也不建议将 JSR-305 依赖项添加到项目的类路径,以利用 Spring 的 null 安全 API。只有在代码库中使用 null 安全注释的项目(例如基于 Spring 的库)才应使用 com.google.code.findbugs:jsr305:3.0.2
添加 compileOnly
Gradle 配置或 Maven provided
范围,以避免编译器警告。