使用@NonNull注解遇到的小問題及解決
使用@NonNull注解遇到問題
先簡單介紹一下NotNull和NonNull的差異
- @NotNull 是 JSR303(Bean的校驗框架)的注解,用于運行時檢查一個屬性是否為空,如果為空則不合法。
- @NonNull 是JSR 305(缺陷檢查框架)的注解,是告訴編譯器這個域不可能為空,當(dāng)代碼檢查有空值時會給出一個風(fēng)險警告,目 前這個注解只有IDEA支持。
下面進入主題
我在使用@NonNull時遇到的小bug:
@NonNull注解的對象 在其形成無參構(gòu)造函數(shù)時,此注解不會默認(rèn)形成無參構(gòu)造器(問題就出在這兒)
例:
(1)ParameterVO.java中加了NonNull注解
@Data? public class ParameterVO implements Serializable{ ? ? ?@NonNull? ? ? ?private String saasId; ?}
編譯后的class文件中(不會生成無參構(gòu)造函數(shù)):
public class ParameterVO implements Serializable{? ? ? @NonNull? ? ? private String saasId; ? ? ? ? @NonNull ?? ? ? public String getSaasId() { ?? ? ? ? return this.saasId; ?? ?} ? ? ? ? .......? }
(2) ParameterVO.java中倘若沒有加上@NonNull注解
@Data? public class test implements Serializable{ ? ? ? private String saasId;? }
對應(yīng)所編譯后的class文件(可以自動生成無參構(gòu)造函數(shù)):
public class test implements Serializable{ ? ? ? private String saasId; ?? ? ? ? public test(){} ? ? ? .......? }
(3)解決方法: 此類情況,在ParameterVO.java中加一個注解@NoArgsConstructor
@Data? @NoArgsConstructor? public class ParameterVO implements Serializable{ ? ? ? @NonNull ? ? ? private String saasId;? }
這樣的話,就可以解決掉因為注解@NonNull導(dǎo)致的沒有生成無參構(gòu)造函數(shù)的問題!
Lombok @NonNull注解
普通的 POJO 需要寫或是用IDEA等集成開發(fā)環(huán)境生成大量gettter, setter方法
普通的 POJO 對于 equals 和 hashCode 等方法,也需要自己維護。特別你寫接口的時候,如果添加了 一個字段忘了維護,可能會導(dǎo)致一些bug
為此Lombok誕生了 它可以簡化你的代碼,讓你的POJO看起來更加地清爽(可以只有類名和字段的聲明,加上少量的注解)
@NonNull注解用來判斷項目中的字段是否為空,為空拋出異常
public class NonNullAnnotation { ? ? @NonNull ? ? @Setter ? ? @Getter ? ? private List<Student> members; ? ? public static void main(String[] args) { ? ? ? ? NonNullAnnotation test = new NonNullAnnotation(); ? ? ? ? test.setMembers(null); ? ? ? ? //test.getMembers(); ? ? } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java語言實現(xiàn)對MySql數(shù)據(jù)庫中數(shù)據(jù)的增刪改查操作的代碼
這篇文章主要介紹了Java語言實現(xiàn)對MySql數(shù)據(jù)庫中數(shù)據(jù)的增刪改查操作的代碼,實現(xiàn)了連接數(shù)據(jù)庫,和數(shù)據(jù)庫的增刪改查操作,有興趣的可以了解一下。2016-12-12Spring數(shù)據(jù)庫連接池實現(xiàn)原理深入刨析
開發(fā)web項目,我們肯定會和數(shù)據(jù)庫打交道,因此就會涉及到數(shù)據(jù)庫鏈接的問題。在以前我們開發(fā)傳統(tǒng)的SSM結(jié)構(gòu)的項目時進行數(shù)據(jù)庫鏈接都是通過JDBC進行數(shù)據(jù)鏈接,我們每和數(shù)據(jù)庫打一次交道都需要先獲取一次鏈接,操作完后再關(guān)閉鏈接,這樣子效率很低,因此就出現(xiàn)了連接池2022-11-11Java開發(fā)學(xué)習(xí)之Bean的生命周期詳解
從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個過程就是一個生命周期。本文將通過示例為大家詳細(xì)講講Bean的生命周期,感興趣的可以學(xué)習(xí)一下2022-06-06spring?cache注解@Cacheable緩存穿透詳解
這篇文章主要介紹了spring?cache注解@Cacheable緩存穿透詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12