最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析Spring 中的Null-Safety

 更新時(shí)間:2019年06月25日 11:43:59   作者:c旋兒  
Spring Framework 本身利用了上面這幾個(gè)注釋,但它們也可以運(yùn)用在任何基于Spring的Java 項(xiàng)目中,以聲明空安全api 和 空安全字段。這篇文章主要介紹了Spring 中的Null-Safety相關(guān)知識 ,需要的朋友可以參考下

之前一直在某些代碼中看到過使用@Nullable 標(biāo)注過的注釋,當(dāng)時(shí)也沒有在意到底是什么意思,所以這篇文章來談?wù)凷pring中關(guān)于Null的那些事。

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

  • @Nullable: 用于指定參數(shù)、返回值或者字段可以作為null的注釋。
  • @NonNull: 與上述注釋相反,表明指定參數(shù)、返回值或者字段不允許為null。(不需要@NonNullApi和@NonNullFields適用的參數(shù)/返回值和字段)
  • @NonNullApi: 包級別的注釋聲明非null作為參數(shù)和返回值。
  • @NonNullFields:包級別的注釋聲明字段默認(rèn)非空

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

@NonNull

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

先來看一個(gè)例子

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的校驗(yàn)是有效的,但是存在一個(gè)缺陷,如果name被設(shè)置為null的話,那么當(dāng)我們使用name的時(shí)候,就會以NullPointerException來結(jié)尾。

使用@NonNull

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

奇怪,并沒有什么變化啊,沒看見有潛在的安全提示啊,那是因?yàn)槟銢]有在idea進(jìn)行設(shè)置

設(shè)置安全檢查

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

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

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

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

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

@NonNullFields

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

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

新建一個(gè)Parent類,并在該類所屬包下創(chuàng)建一個(gè)名為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;

新建一個(gè)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類中所有的屬性起作用,把鼠標(biāo)放在任意一個(gè)屬性上,會出現(xiàn)編譯期檢查的提示

@Nullable

@NonNullFields注釋通常比@NonNull更好,因?yàn)樗兄跍p少樣板。 但是,有時(shí)我們想要從包級別指定的非null約束中免除某些字段,這時(shí)候就會使用到@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

與@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;

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

后記:

看完文章,你至少應(yīng)該了解

  • 四個(gè)注解 @NonNull, @Nullable, @NonNullFields, @NonNullApi 四個(gè)注解各自的作用范圍
  • 如何設(shè)置編譯期的Null-safety檢查

總結(jié)

以上所述是小編給大家介紹的Spring 中的Null-Safety,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Java Date時(shí)間類型的操作實(shí)現(xiàn)

    Java Date時(shí)間類型的操作實(shí)現(xiàn)

    本文主要介紹Java Date 日期類型,以及Calendar的怎么獲取時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • SpringBoot圖片上傳和訪問路徑映射

    SpringBoot圖片上傳和訪問路徑映射

    這篇文章主要為大家詳細(xì)介紹了SpringBoot圖片上傳和訪問路徑映射,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 創(chuàng)建一個(gè)Java的不可變對象

    創(chuàng)建一個(gè)Java的不可變對象

    這篇文章主要介紹了創(chuàng)建一個(gè)Java的不可變對象,一個(gè)類的對象在通過構(gòu)造方法創(chuàng)建后如果狀態(tài)不會再被改變,那么它就是一個(gè)不可變(immutable)類。它的所有成員變量的賦值僅在構(gòu)造方法中完成,不會提供任何 setter 方法供外部類去修改,需要的朋友可以參考下
    2021-11-11
  • 詳解Java中switch的新特性

    詳解Java中switch的新特性

    這篇文章主要介紹了Java中switch的新特性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Mybatis下劃線駝峰處理的幾種方法

    Mybatis下劃線駝峰處理的幾種方法

    這篇文章主要講述Mybatis下劃線駝峰處理的幾種方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • mybatis-generator自動生成dao、mapping、bean配置操作

    mybatis-generator自動生成dao、mapping、bean配置操作

    這篇文章主要介紹了mybatis-generator自動生成dao、mapping、bean配置操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 如何安裝java的運(yùn)行環(huán)境IDEA

    如何安裝java的運(yùn)行環(huán)境IDEA

    這篇文章主要介紹了如何安裝java的運(yùn)行環(huán)境IDEA,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • VMware虛擬機(jī)下hadoop1.x的安裝方法

    VMware虛擬機(jī)下hadoop1.x的安裝方法

    這篇文章主要為大家詳細(xì)介紹了VMware虛擬機(jī)下hadoop1.x的安裝方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • java實(shí)現(xiàn)學(xué)生成績信息管理系統(tǒng)

    java實(shí)現(xiàn)學(xué)生成績信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生成績信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • 一個(gè)簡單JDK版動態(tài)代理

    一個(gè)簡單JDK版動態(tài)代理

    這篇文章主要為大家詳細(xì)介紹了一個(gè)簡單JDK版動態(tài)代理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09

最新評論

论坛| 梁山县| 靖西县| 祁连县| 大荔县| 依安县| 顺昌县| 裕民县| 阿巴嘎旗| 岗巴县| 郯城县| 双桥区| 思茅市| 邓州市| 上栗县| 廊坊市| 左云县| 平利县| 扬州市| 阿瓦提县| 东山县| 杭锦后旗| 涟源市| 米易县| 始兴县| 巨鹿县| 金昌市| 淅川县| 资源县| 肥西县| 托克托县| 亚东县| 湖州市| 高台县| 鹿泉市| 延长县| 维西| 潮州市| 中阳县| 宣化县| 庆安县|