成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我賭你不清楚Spring中關(guān)于Null的這些事

開發(fā) 后端
之前一直在某些代碼中看到過使用@Nullable 標(biāo)注過的注釋,當(dāng)時(shí)也沒有在意到底是什么意思,之后忍不住去調(diào)查一番,這篇文章來談?wù)凷pring中關(guān)于Null的那些事。

之前一直在某些代碼中看到過使用@Nullable 標(biāo)注過的注釋,當(dāng)時(shí)也沒有在意到底是什么意思,之后忍不住去調(diào)查一番,這篇文章來談?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: 包級(jí)別的注釋聲明非null作為參數(shù)和返回值。
  •  @NonNullFields:包級(jí)別的注釋聲明字段默認(rèn)非空

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

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

@NonNull

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

先來看一個(gè)例子 

  1. public class Student {  
  2.     private String name;  
  3.     public String getName() {  
  4.         return name;  
  5.     }  
  6.     public void setName(String name) {  
  7.         if(null != null && name.isEmpty()){  
  8.             name = null 
  9.         }  
  10.         this.name = name;  
  11.     }  

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

使用@NonNull

Spring 的null-safety特性能夠允許idea或者eclipse報(bào)告這個(gè)潛在的威脅,例如,如果我們用IDEA對(duì)屬性加上@NonNull會(huì)出現(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 上,就沒有這句提示了。

@NonNullFields

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

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

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

package-info.java 

  1. @NonNullFields  
  2. package com.nullsafety.demo.pojo;  
  3. import org.springframework.lang.NonNullFields; 

新建一個(gè)Parent.java 類 

  1. public class Parent {  
  2.     private String son;  
  3.     private String age;  
  4.     private String name;  
  5.     public void setSon(String son) {  
  6.         if(son != null && son.isEmpty()){  
  7.             son = null 
  8.         }  
  9.         this.son = son;  
  10.     }  
  11.     public void setAge(String age) {  
  12.         if(age != null && age.isEmpty()){  
  13.             age = null 
  14.         }  
  15.         this.age = age;  
  16.     }  
  17.     public void setName(String name) {  
  18.         if(name != null && name.isEmpty()){  
  19.             name = null 
  20.         }  
  21.         this.name = name;  
  22.     }  

package-info.java 中的@NonNullFields能夠?qū)arent類中所有的屬性起作用,把鼠標(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 處于同一包下 

  1. public class Person {  
  2.     @NonNull  
  3.     private String fullName;  
  4.     @Nullable  
  5.     private String nickName;  
  6.     public String getNickName() {  
  7.         return nickName;  
  8.     }  
  9.     public void setNickName(String nickName) {  
  10.         if(nickName != null && nickName.isEmpty()){  
  11.             nickName = null 
  12.         }  
  13.         this.nickName = nickName;  
  14.     }  
  15.     public String getFullName() {  
  16.         return fullName;  
  17.     }  
  18.     public void setFullName(String fullName) {  
  19.         if(fullName != null && fullName.isEmpty()){  
  20.             fullName = null 
  21.         }  
  22.         this.fullName = fullName;  
  23.     }  

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

@NonNullApi

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

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

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

package-info.java 

  1. @NonNullApi  
  2. @NonNullFields  
  3. package com.nullsafety.demo.pojo;  
  4. import org.springframework.lang.NonNullApi;  
  5. import org.springframework.lang.NonNullFields; 

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

結(jié)語

看完文章,你至少應(yīng)該了解@NonNull, @Nullable, @NonNullFields, @NonNullApi四個(gè)注解和各自的作用范圍以及如何設(shè)置編譯期的Null-safety檢查。

責(zé)任編輯:龐桂玉 來源: Java知音
相關(guān)推薦

2021-06-07 09:20:56

Javascript運(yùn)算符開發(fā)

2021-02-14 22:33:23

Java字符字段

2020-09-10 16:10:17

js繼承模式前端

2021-03-10 08:56:37

Zookeeper

2018-05-22 16:24:20

HashMapJavaJDK

2020-11-25 09:49:05

Hibernate

2024-02-29 09:08:56

Encoding算法加密

2020-11-11 07:32:18

MySQL InnoDB 存儲(chǔ)

2023-08-07 11:07:30

5G電信TECS

2021-07-27 07:31:16

JavaArrayList數(shù)組

2022-05-15 21:52:04

typeTypeScriptinterface

2023-07-13 09:05:57

react hook類型types

2018-12-17 12:30:05

Kubernetes存儲(chǔ)存儲(chǔ)卷

2017-03-07 11:45:57

DevOps容器

2020-10-30 08:20:04

SD卡TF卡存儲(chǔ)

2021-11-09 06:01:35

前端JITAOT

2023-09-03 21:18:07

Python編程語言

2021-09-28 06:28:50

云原生安全云計(jì)算

2023-08-04 08:25:03

客戶配置Spring

2013-12-12 16:59:39

諾基亞微軟
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产成人免费视频网站视频社区 | 欧美一区二区在线 | 亚洲一区二区av在线 | 午夜在线观看免费 | 精品视频免费 | 美女黄视频网站 | 午夜久久久 | 欧美一级免费片 | 国产午夜一级 | 中文字幕精品视频在线观看 | 亚洲欧美日韩中文在线 | 欧美一区二区在线观看 | 色就是色欧美 | 国产精品久久久亚洲 | 日韩视频一级 | 久久亚洲一区二区三区四区 | 精品国产一区二区三区久久狼黑人 | 日韩看片| 亚洲xx在线 | 激情在线视频网站 | 亚洲另类自拍 | 九九综合 | 久久91| 伊人久久大香线 | 国产一区视频在线 | 久久九九网站 | 久久久亚洲综合 | 亚洲欧美日本国产 | 欧美在线一区二区视频 | 中文字幕在线看第二 | 国产片侵犯亲女视频播放 | 日韩国产一区二区三区 | 久久久亚洲综合 | 国产精品久久久亚洲 | 亚洲少妇综合网 | 日本一区二区三区在线观看 | 国产亚洲一区二区三区 | 欧美成视频在线观看 | 久久国内 | 成人一区av偷拍 | 日本一区不卡 |