空安全

儘管 Java 的型別系統不允許表達空安全,但 Spring Framework 在 org.springframework.lang 包中提供了以下註解,用於宣告 API 和欄位的可空性:

  • @Nullable:一個註解,用於指示特定的引數、返回值或欄位可以為 null

  • @NonNull:一個註解,用於指示特定的引數、返回值或欄位不能為 null(在應用了 @NonNullApi@NonNullFields 的引數、返回值和欄位上則不需要此註解)。

  • @NonNullApi:一個包級別註解,宣告引數和返回值的預設語義為非空。

  • @NonNullFields:一個包級別註解,宣告欄位的預設語義為非空。

Spring Framework 本身就使用了這些註解,但它們也可用於任何基於 Spring 的 Java 專案中,以宣告空安全的 API 和可選的空安全欄位。尚不支援泛型型別引數、可變引數和陣列元素的空安全宣告。空安全宣告預計將在 Spring Framework 的各個版本之間(包括次要版本)進行微調。方法體內部使用的型別的空安全不在本功能的範圍之內。

其他常用庫(如 Reactor 和 Spring Data)也提供了使用類似空安全安排的空安全 API,為 Spring 應用開發者提供了整體一致的體驗。

用例

除了為 Spring Framework API 的可空性提供顯式宣告外,這些註解還可以被 IDE(如 IDEA 或 Eclipse)用來提供與空安全相關的有用警告,以避免執行時出現 NullPointerException

它們也被用於使 Spring API 在 Kotlin 專案中實現空安全,因為 Kotlin 原生支援空安全。更多詳情請參閱Kotlin 支援文件

JSR-305 元註解

Spring 註解使用 JSR 305 註解進行元註解(一個休眠但廣泛使用的 JSR)。JSR-305 元註解允許 IDEA 或 Kotlin 等工具供應商以通用方式提供空安全支援,而無需硬編碼對 Spring 註解的支援。

利用 Spring 的空安全 API 時,既不需要也不推薦向專案類路徑新增 JSR-305 依賴。只有像在程式碼庫中使用空安全註解的基於 Spring 的庫這樣的專案,才應在 Gradle 配置中新增 com.google.code.findbugs:jsr305:3.0.2 並使用 compileOnly,或在 Maven 中使用 provided 範圍,以避免編譯器警告。