小編給大家分享一下Spring中關(guān)于Null的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)公司專(zhuān)注于驛城網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供驛城營(yíng)銷(xiāo)型網(wǎng)站建設(shè),驛城網(wǎng)站制作、驛城網(wǎng)頁(yè)設(shè)計(jì)、驛城網(wǎng)站官網(wǎng)定制、成都小程序開(kāi)發(fā)服務(wù),打造驛城網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供驛城網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
之前一直在某些代碼中看到過(guò)使用@Nullable 標(biāo)注過(guò)的注釋?zhuān)?dāng)時(shí)也沒(méi)有在意到底是什么意思,之后忍不住去調(diào)查一番,這篇文章來(lái)談?wù)凷pring中關(guān)于Null的那些事。
在Java中不允許你使用類(lèi)型表示其null的安全性,但Spring Framework 現(xiàn)在在org.sprinngframework.lang包提供以下注釋?zhuān)员懵暶鰽PI和字段的可空性:
@Nullable: 用于指定參數(shù)、返回值或者字段可以作為null的注釋。
@NonNull: 與上述注釋相反,表明指定參數(shù)、返回值或者字段不允許為null。(不需要@NonNullApi和@NonNullFields適用的參數(shù)/返回值和字段)
@NonNullApi: 包級(jí)別的注釋聲明非null作為參數(shù)和返回值。
@NonNullFields:包級(jí)別的注釋聲明字段默認(rèn)非空
Spring Framework 本身利用了上面這幾個(gè)注釋?zhuān)鼈円部梢赃\(yùn)用在任何基于Spring的Java 項(xiàng)目中,以聲明空安全api 和 空安全字段。尚未支持泛型和數(shù)組元素的可空性,但應(yīng)該也會(huì)在后期版本中支持這倆。
Spring Null-Safety出現(xiàn)在Spring5中,讓我們更方便的編寫(xiě)空安全的代碼,這叫做null-safety,null-safety不是讓我們逃脫不安全的代碼,而是在編譯時(shí)產(chǎn)生警告。 此類(lèi)警告可以在運(yùn)行時(shí)防止災(zāi)難性空指針異常(NPE)。
@NonNull
@NonNull注釋是null-safety的所有注釋中最重要的一個(gè),我們可以使用此注釋在期望對(duì)象引用的任何地方聲明非空約束:字段、方法參數(shù)或者方法返回值。
先來(lái)看一個(gè)例子
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;
}
}上述代碼對(duì)name的校驗(yàn)是有效的,但是存在一個(gè)缺陷,如果name被設(shè)置為null的話(huà),那么當(dāng)我們使用name的時(shí)候,就會(huì)以NullPointerException來(lái)結(jié)尾。
使用@NonNull
Spring 的null-safety特性能夠允許idea或者eclipse報(bào)告這個(gè)潛在的威脅,例如,如果我們用IDEA對(duì)屬性加上@NonNull會(huì)出現(xiàn)如下的效果。

奇怪,并沒(méi)有什么變化啊,沒(méi)看見(jiàn)有潛在的安全提示啊,那是因?yàn)槟銢](méi)有在idea進(jìn)行設(shè)置。
設(shè)置安全檢查
如果你也沒(méi)有提示的話(huà),可以通過(guò)如下的方式設(shè)置安全檢查:

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

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

現(xiàn)在fullName 已經(jīng)被@NonNull 注釋添加編譯器檢查null值的功能了!
測(cè)試一下,可以把@NonNull 注釋去掉,你的鼠標(biāo)再放在fullName 上,就沒(méi)有這句提示了。
@NonNullFields
@NonNull 注解能夠幫助你確保null-safety。然而,如果此注釋直接裝飾所有的字段的話(huà),就會(huì)污染整個(gè)代碼庫(kù)。
Spring提供了另外一個(gè)不允許為null的注解 — @NonNullFields。這個(gè)注解適合用在包級(jí)別上,通知我們的開(kāi)發(fā)工具注釋包中所有的字段,默認(rèn)的,不允許為null
新建一個(gè)Parent類(lèi),并在該類(lèi)所屬包下創(chuàng)建一個(gè)名為package-info.java的類(lèi),創(chuàng)建的不是Java類(lèi),而是創(chuàng)建的file,名為package-info.java,如下
package-info.java
@NonNullFields package com.nullsafety.demo.pojo; import org.springframework.lang.NonNullFields;
新建一個(gè)Parent.java 類(lèi)
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類(lèi)中所有的屬性起作用,把鼠標(biāo)放在任意一個(gè)屬性上,會(huì)出現(xiàn)編譯期檢查的提示

@Nullable
@NonNullFields注釋通常比@NonNull更好,因?yàn)樗兄跍p少樣板。 但是,有時(shí)我們想要從包級(jí)別指定的非null約束中免除某些字段,這時(shí)候就會(huì)使用到@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注釋來(lái)覆蓋字段上@NonNullFields的語(yǔ)義。
@NonNullApi
@NonNullFields注釋僅適用于其名稱(chēng)所示的字段。 如果我們想對(duì)方法的參數(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í)候接受到編譯期的提示。

看完了這篇文章,相信你對(duì)“Spring中關(guān)于Null的示例分析”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
本文名稱(chēng):Spring中關(guān)于Null的示例分析
網(wǎng)頁(yè)網(wǎng)址:http://chinadenli.net/article6/ggjgig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、App設(shè)計(jì)、網(wǎng)站維護(hù)、網(wǎng)頁(yè)設(shè)計(jì)公司、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)