溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Spring 中Null-Safety的作用有哪些

發(fā)布時間:2021-01-18 16:11:41 來源:億速云 閱讀:221 作者:Leah 欄目:編程語言

Spring 中Null-Safety的作用有哪些?針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

在Java中不允許讓你使用類型表示其null的安全性,但Spring Framework 現(xiàn)在在org.sprinngframework.lang包提供以下注釋,以便聲明API和字段的可空性:

  • @Nullable: 用于指定參數(shù)、返回值或者字段可以作為null的注釋。

  • @NonNull: 與上述注釋相反,表明指定參數(shù)、返回值或者字段不允許為null。(不需要@NonNullApi和@NonNullFields適用的參數(shù)/返回值和字段)

  • @NonNullApi: 包級別的注釋聲明非null作為參數(shù)和返回值。

  • @NonNullFields:包級別的注釋聲明字段默認非空

Spring Framework 本身利用了上面這幾個注釋,但它們也可以運用在任何基于Spring的Java 項目中,以聲明空安全api 和 空安全字段。尚未支持泛型和數(shù)組元素的可空性,但應(yīng)也即將發(fā)布在后來的版本。Spring Null-Safety出現(xiàn)在Spring5中,讓我們更方便的編寫空安全的代碼,這叫做null-safety,null-safety不是讓我們逃脫不安全的代碼,而是在編譯時產(chǎn)生警告。 此類警告可以在運行時防止災(zāi)難性空指針異常(NPE)。

@NonNull

@NonNull注釋是null-safety的所有注釋中最重要的一個,我們可以使用此注釋在期望對象引用的任何地方聲明非空約束:字段、方法參數(shù)或者方法返回值。

先來看一個例子

public class Student {

  private String name;

  public String getName() {
    return name;
  }
  public void setName(String name) {
    if(name != null && name.isEmpty()){
      name = null;
    }
    this.name = name;
  }
}

上述代碼對name的校驗是有效的,但是存在一個缺陷,如果name被設(shè)置為null的話,那么當(dāng)我們使用name的時候,就會以NullPointerException來結(jié)尾。

使用@NonNull

Spring 的null-safety特性能夠允許idea或者eclipse報告這個潛在的威脅,例如,如果我們用IDEA對屬性加上@NonNull會出現(xiàn)如下的效果。

Spring 中Null-Safety的作用有哪些

奇怪,并沒有什么變化啊,沒看見有潛在的安全提示啊,那是因為你沒有在idea進行設(shè)置

設(shè)置安全檢查

如果你也沒有提示的話,可以通過如下的方式設(shè)置安全檢查

Spring 中Null-Safety的作用有哪些

如果還不好使的話,那就在右側(cè) configuration annotations 添加一下 @NonNull和 @Nullable 所在的jar包,如下:

Spring 中Null-Safety的作用有哪些

添加上,打上 ? 即可看到如下效果。

Spring 中Null-Safety的作用有哪些

現(xiàn)在fullName 已經(jīng)被@NonNull 注釋添加編譯器檢查null值的功能了!

如果你不相信的話,可以把@NonNull 注釋去掉,你的鼠標再放在fullName 上,已經(jīng)沒有這句提示了。

@NonNullFields

@NonNull 注解能夠幫助你確保null-safety。然而,如果此注釋直接裝飾所有的字段的話,就會污染整個代碼庫。

Spring提供了另外一個不允許為null的注解 — @NonNullFields。這個注解適合用在包級別上,通知我們的開發(fā)工具注釋包中所有的字段,默認的,不允許為null

新建一個Parent類,并在該類所屬包下創(chuàng)建一個名為package-info.java的類,創(chuàng)建的不是Java類,而是創(chuàng)建的file,名為package-info.java,如下

package-info.java

@NonNullFields
package com.nullsafety.demo.pojo;

import org.springframework.lang.NonNullFields;

新建一個Parent.java

public class Parent {

  private String son;
  private String age;
  private String name;

  public void setSon(String son) {
    if(son != null && son.isEmpty()){
      son = null;
    }
    this.son = son;
  }

  public void setAge(String age) {
    if(age != null && age.isEmpty()){
      age = null;
    }
    this.age = age;
  }

  public void setName(String name) {
    if(name != null && name.isEmpty()){
      name = null;
    }
    this.name = name;
  }
}

package-info.java 中的@NonNullFields能夠?qū)arent類中所有的屬性起作用,把鼠標放在任意一個屬性上,會出現(xiàn)編譯期檢查的提示

Spring 中Null-Safety的作用有哪些

@Nullable

@NonNullFields注釋通常比@NonNull更好,因為它有助于減少樣板。 但是,有時我們想要從包級別指定的非null約束中免除某些字段,這時候就會使用到@Nullable注解

改造一下Person.java,Person.java 與pack-info.java 處于同一包下

public class Person {

  @NonNull
  private String fullName;

  @Nullable
  private String nickName;

  public String getNickName() {
    return nickName;
  }

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

  public String getFullName() {
    return fullName;
  }

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

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

@NonNullApi

@NonNullFields注釋僅適用于其名稱所示的字段。 如果我們想對方法的參數(shù)和返回值產(chǎn)生相同的影響,我們需要@NonNullApi。

添加 @NonNullApi和 @NonNullFields 在 configure annotations 中,并選用NonNullApi

Spring 中Null-Safety的作用有哪些

與@NonNullFields一樣,我們需要在package-info.java 中定義@NonNullApi

package-info.java

@NonNullApi
@NonNullFields
package com.nullsafety.demo.pojo;

import org.springframework.lang.NonNullApi;
import org.springframework.lang.NonNullFields;

加上如下注釋后的效果如下: 可以在返回值的時候接受到編譯期的提示。

Spring 中Null-Safety的作用有哪些


關(guān)于Spring 中Null-Safety的作用有哪些問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI