知識庫 / Spring RSS 訂閱

Spring Null-Safety 註解

Spring
HongKong
9
01:37 PM · Dec 06 ,2025

1. 概述

從 Spring 5 開始,我們現在可以訪問一個有趣的功能,幫助我們編寫更安全的代碼。這個功能稱為“空安全”,一組註解,就像一個安全衞士,監視潛在的空引用。

與其讓我們的代碼得以逃避不安全的情況,空安全功能會在編譯時產生警告。 這樣的警告可以防止在運行時發生災難性的空指針異常 (NPE)。

2. 註解

@NonNull 註解是空安全功能中最重要的註解之一。 我們可以使用這個註解在任何對象引用被期望的地方聲明非空約束: 字段、方法參數或方法返回值。

假設我們有一個名為 Person 的類:

public class Person {
    private String fullName;

    void setFullName(String fullName) {
        if (fullName != null && fullName.isEmpty()) {
            fullName = null;
        }
        this.fullName = fullName;
    }

    // getter
}

此類定義有效,但存在缺陷——fullName字段可能被設置為null。如果發生這種情況,我們可能會在處理fullName時遇到 NPE。

Spring 的空安全特性使工具能夠報告此類危險。例如,如果在 IntelliJ IDEA 中編寫代碼併為fullName字段添加@NonNull註解,我們將會看到警告:

得益於此指示,我們能夠提前意識到問題並採取適當措施以避免運行時錯誤。

3. @NonNullFields 標註

@NonNull 標註在確保空安全方面非常有用。但是,如果我們裝飾所有非空字段,使用此標註,將會污染整個代碼庫。

我們可以使用另一個標註來避免濫用@NonNull——@NonNullFields此標註可應用於包級別,通知我們的開發工具,所標註的包中的所有字段默認情況下都是非空。

為了使@NonNullFields 標註生效,我們需要在包的根目錄中創建一個名為 package-info.java 的文件,並使用 @NonNullFields 標註該包:

@NonNullFields
package org.baeldung.nullibility;

讓我們在 Person 類中聲明另一個屬性,名為 nickName

package org.baeldung.nullibility;

// import statements

public class Person {
    private String nickName;

    void setNickName(@Nullable String nickName) {
        if (nickName != null && nickName.isEmpty()) {
            nickName = null;
        }
        this.nickName = nickName;
    }

    // other declarations
}

本次,我們沒有為 nickName 字段添加 @NonNull 註解,但仍然存在類似的注意事項:

@NonNullFields 註解可以減少代碼冗餘,同時確保與 @NonNull 提供的相同安全級別。

4. @Nullable 註解

@NonNullFields 註解通常比@NonNull 更可取,因為它有助於減少冗餘代碼。 在某些情況下,我們希望免除某些字段從包級別上指定的非空約束。

讓我們回到 nickName 字段,併為其添加 @Nullable 註解:

@Nullable
private String nickName;

我們之前看到的警告已消失:

在這種情況下,我們使用 @Nullable 註解來覆蓋 @NonNullFields 註解在字段上的語義。

5. 《@NonNullApi》註解

<em>@NonNullApi</em> 註解僅適用於字段,正如其名稱所示。 為了在方法參數和返回值上產生相同的效果,我們需要使用 <em>@NonNullApi</em>

<em>@NonNullFields</em> 類似,我們必須在 <em>package-info.java</em> 文件中指定 <em>@NonNullApi</em> 註解:

@NonNullApi
package org.baeldung.nullibility;

讓我們定義一個獲取 nickName 字段值的getter:

package org.baeldung.nullibility;

// import statements

public class Person {
    @Nullable
    private String nickName;

    String getNickName() {
        return nickName;
    }

    // other declarations
}

啓用 @NonNullApi 註解後,會發出警告,提示 getNickName 方法可能產生空值。

請注意,與 @NonNullFields 註解一樣,我們也可以使用 @Nullable 註解在方法級別覆蓋 @NonNullApi 註解。

6. 結論

Spring 的空安全特性是一個強大的功能,有助於減少 NPE(空指針異常)的發生。但是,在使用該特性時,我們需要注意以下兩點:

  • 它僅可在支持性開發工具中啓用,例如 IntelliJ IDEA
  • 它並不能在運行時強制執行 null 檢查 – 我們仍然需要自己編寫代碼來避免 NPEs
user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.