Spring 中Null-Safety的作用有哪些?針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
創(chuàng)新互聯(lián)公司主營陽明網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),陽明h5小程序定制開發(fā)搭建,陽明網(wǎng)站營銷推廣歡迎陽明等地區(qū)企業(yè)咨詢
在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 本身利用了上面這幾個注釋,但它們也可以運用在任何基于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)如下的效果。
奇怪,并沒有什么變化啊,沒看見有潛在的安全提示啊,那是因為你沒有在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。然而,如果此注釋直接裝飾所有的字段的話,就會污染整個代碼庫。
Spring提供了另外一個不允許為null的注解 — @NonNullFields
。這個注解適合用在包級別上,通知我們的開發(fā)工具注釋包中所有的字段,默認(rèn)的,不允許為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類中所有的屬性起作用,把鼠標(biāo)放在任意一個屬性上,會出現(xiàn)編譯期檢查的提示
@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
與@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;
加上如下注釋后的效果如下: 可以在返回值的時候接受到編譯期的提示。
關(guān)于Spring 中Null-Safety的作用有哪些問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。