91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Spring中關于Null的示例分析

發布時間:2021-09-10 17:51:32 來源:億速云 閱讀:146 作者:小新 欄目:編程語言

小編給大家分享一下Spring中關于Null的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

之前一直在某些代碼中看到過使用@Nullable 標注過的注釋,當時也沒有在意到底是什么意思,之后忍不住去調查一番,這篇文章來談談Spring中關于Null的那些事。

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

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

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

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

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

Spring Framework 本身利用了上面這幾個注釋,但它們也可以運用在任何基于Spring的Java 項目中,以聲明空安全api 和 空安全字段。尚未支持泛型和數組元素的可空性,但應該也會在后期版本中支持這倆。

Spring Null-Safety出現在Spring5中,讓我們更方便的編寫空安全的代碼,這叫做null-safety,null-safety不是讓我們逃脫不安全的代碼,而是在編譯時產生警告。 此類警告可以在運行時防止災難性空指針異常(NPE)。

@NonNull

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

先來看一個例子

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

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

使用@NonNull

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

Spring中關于Null的示例分析

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

設置安全檢查

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

Spring中關于Null的示例分析

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

Spring中關于Null的示例分析

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

Spring中關于Null的示例分析

現在fullName 已經被@NonNull 注釋添加編譯器檢查null值的功能了!

測試一下,可以把@NonNull 注釋去掉,你的鼠標再放在fullName 上,就沒有這句提示了。

@NonNullFields

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

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

新建一個Parent類,并在該類所屬包下創建一個名為package-info.java的類,創建的不是Java類,而是創建的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能夠對Parent類中所有的屬性起作用,把鼠標放在任意一個屬性上,會出現編譯期檢查的提示

Spring中關于Null的示例分析

@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注釋僅適用于其名稱所示的字段。 如果我們想對方法的參數和返回值產生相同的影響,我們需要@NonNullApi。

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

Spring中關于Null的示例分析

與@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的示例分析

看完了這篇文章,相信你對“Spring中關于Null的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

两当县| 开平市| 白沙| 全南县| 大冶市| 富民县| 嘉黎县| 民勤县| 定州市| 大港区| 衡阳市| 湘潭市| 天津市| 忻城县| 迁安市| 浪卡子县| 固镇县| 霍州市| 开封县| 永宁县| 安阳市| 荔波县| 香格里拉县| 都匀市| 贡山| 察哈| 新闻| 宝坻区| 类乌齐县| 广灵县| 枣强县| 涞源县| 吴堡县| 天柱县| 阜阳市| 太仆寺旗| 河间市| 景谷| 福鼎市| 乌拉特前旗| 那曲县|