網站首頁 編程語言 正文
文章目錄
- 1. 前言
- 2. 先說結論
- 3. 演示
- 4. 解決方法
- 1. 在實體類上再加上@AllArgsConstructor即可
- 2. 手寫個無參構造函數并加上@Tolerate
- 3. 手寫有參無參構造方法
1. 前言
- 在創建實體類的時候,有時候參數過于多,如果使用有參數的構造函數,實在看起來不是很優雅,一般都會想使用@Builder構建者模式來進行創建對象,不僅僅優雅,而且還方便。
- 當偶然機會發現,如果使用了@Builder,該實體類會失去無參構造方法。
- 具體現象如下:
當不加任何注解的時候,完成正常:
當加了@Builder的時候,則會直接出現下面的錯誤,提示沒有無參的構造函數:
2. 先說結論
- 由于沒有時間深入查看@Builder的源碼,但是可以從編譯之后的字節碼得出結論:
- 實體類使用了@Builder,會有全參構造函數,沒有默認無參構造函數,即無法使用默認無參構造函數。
- 解決方法:
-
在實體類上同時加上:@Builder、@AllArgsConstructor、@NoArgsConstructor
-
手寫全部有參構造方法,以及 無參構造方法
-
手寫個默認無參構造方法,并加上@Tolerate
@Builder public class demoBuilderEntry { private String name; private String sex; @Tolerate public demoBuilderEntry() { } }
-
3. 演示
-
若不知道怎么查看java反編譯字節碼內容,可以看一下:
Java 如何進行反編譯生成.java文件(javap、jad下載安裝使用) -
當實體類不加任何東西:
public class demoBuilderEntry { private String name; private String sex; }
可以看見是默認有無參構造函數
public class demoBuilderEntry { public demoBuilderEntry() { } private String name; private String sex; }
-
當實體類加上@Builder注解:
@Builder public class demoBuilderEntry { private String name; private String sex; }
可以看出:無參構造函數已不存在,只剩全參構造函數:
public class demoBuilderEntry { public static class demoBuilderEntryBuilder { public demoBuilderEntryBuilder name(String name) { this.name = name; return this; } public demoBuilderEntryBuilder sex(String sex) { this.sex = sex; return this; } public demoBuilderEntry build() { return new demoBuilderEntry(name, sex); } public String toString() { return (new StringBuilder()).append("demoBuilderEntry.demoBuilderEntryBuilder(name=").append(name).append(", sex=").append(sex).append(")").toString(); } private String name; private String sex; demoBuilderEntryBuilder() { } } demoBuilderEntry(String name, String sex) { this.name = name; this.sex = sex; } public static demoBuilderEntryBuilder builder() { return new demoBuilderEntryBuilder(); } private String name; private String sex; }
因此,如下圖,一定會報錯:
有人會說:沒有無參怎么了,也沒有什么事情,反正需要構造。
但像spring這種,我們可以從配置文件中注入屬性,如@ConfigurationProperties,它們的做法是先創建該類對象,使用無參構造函數,然后再調用set方法,此時,你沒有默認無參構造方法,必然會失敗,畢竟連對象都沒有創建成功。
具體失敗案例可以看:實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗 -
如果需要無參構造函數,那就手動添加,在實體類上,再加上@NoArgsConstructor也無效。
根據下圖可以看見,似乎沒有報錯當運行的時候,則報錯如下:與實際參數列表不符,顯然是無法通過加@NoArgsConstructor創建默認無參構造函數。
4. 解決方法
1. 在實體類上再加上@AllArgsConstructor即可
-
根據下圖查看,似乎也沒有問題:
-
點擊運行,查看結果的時候,居然可以運行成功如下:
-
反手我們去看一下反編譯:
public class demoBuilderEntry { public static class demoBuilderEntryBuilder { // builder 的代碼省略,沒有粘出來 } public static void main(String args[]) { System.out.println(new demoBuilderEntry()); } public static demoBuilderEntryBuilder builder() { return new demoBuilderEntryBuilder(); } public demoBuilderEntry(String name, String sex) { this.name = name; this.sex = sex; } // 無參構造函數有了 public demoBuilderEntry() { } private String name; private String sex; }
2. 手寫個無參構造函數并加上@Tolerate
-
@Tolerate:中文:容許,通俗來說,被該注解加上的方法,讓lombok容許它們存在。
/** * Put on any method or constructor to make lombok pretend it doesn't exist, * i.e., to generate a method which would otherwise be skipped due to possible conflicts. */ @Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) @Retention(RetentionPolicy.SOURCE) public @interface Tolerate { }
-
測試:
3. 手寫有參無參構造方法
- 這種方法是最簡單粗暴的,但是代碼可能會沒有那么簡潔:
原文鏈接:https://blog.csdn.net/xueyijin/article/details/124391228
相關推薦
- 2022-06-20 詳解Python列表解析式的使用方法_python
- 2022-05-20 利用PyQt5模擬實現網頁鼠標移動特效_python
- 2023-03-03 Android獲取RecyclerView滑動距離方法詳細講解_Android
- 2023-04-07 關于C#中的Invoke示例詳解_C#教程
- 2022-05-20 C++實現公司人事管理系統_C 語言
- 2022-07-02 webpack分離公共模塊失敗
- 2022-06-30 利用Python刪除電腦中重復文件的方法_python
- 2022-12-12 Android?DataBinding類關系深入探究_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支