Lombok 同時(shí)使用 @Data 和 @Builder 的巨坑,千萬(wàn)別亂用!
共 2980字,需瀏覽 6分鐘
·
2024-08-16 07:38
閱讀本文大概需要 4 分鐘。
來(lái)自:juejin.cn/post/7103011031672176677
問(wèn)題背景
@Data和@Builder ,構(gòu)建無(wú)參構(gòu)造器報(bào)錯(cuò)!編譯不通過(guò)。如下圖:
Lombok @Data和@Builder分別單獨(dú)分析用法
@Data可以?成?參構(gòu)造和類??所有屬性的getter/setter?法。可以簡(jiǎn)化我們代碼的開發(fā)。(需要安裝Lombok插件和引?Lombok依賴)。
GET/SET?法和?參構(gòu)造函數(shù)。
@Builder注解,將會(huì)幫助我們?成全屬性的構(gòu)造?法。
@Builder注解是無(wú)法生成get和set的。
@Data和@Builder的話,可以看出盡管?成了GET/SET?法,但是?參構(gòu)造?法沒有了,這顯然是不能接受的,因?yàn)楹芏嗫蚣芏紩?huì)調(diào)??參構(gòu)造去創(chuàng)建對(duì)象。
解決方法
方法一
@Data和@Builder的時(shí)候,如果要?成?參構(gòu)造,需要在代碼???動(dòng)引?注解@Tolerate,讓Lombok在?成類的時(shí)候,對(duì)指定的構(gòu)造函數(shù)不感知。
方法二(感謝評(píng)論區(qū) 九又四分之三 提供思路)
@RequiredArgsConstructor 來(lái)構(gòu)建有參,@NoArgsConstructor來(lái)構(gòu)建無(wú)參構(gòu)造器,如圖所示:
Lombok原理
-
Lombok 使?的是 JDK 6 實(shí)現(xiàn)的 JSR 269: Pluggable Annotation Processing API(編譯期的注解處理器),它是在編譯期時(shí)把 Lombok 的注解代碼,轉(zhuǎn)換為常規(guī)的 Java ?法?實(shí)現(xiàn)注?。 -
在編譯期階段,當(dāng) Java 源碼被抽象成語(yǔ)法樹 (AST) 之后,Lombok 會(huì)根據(jù)??的注解處理器動(dòng)態(tài)的修改AST,增加新的代碼 (節(jié)點(diǎn)),在這?切執(zhí)?之后,再通過(guò)分析?成了最終的字節(jié)碼 (.class) ?件,這就是Lombok 的執(zhí)?原理。
-
?定義?個(gè)注解標(biāo)簽接?,并實(shí)現(xiàn)?個(gè)?定義的注解處理器; -
利? tools.jar的javac api處理 AST (抽象語(yǔ)法樹)3. 使??定義的注解處理器編譯代碼。
1.定義?定義注解和注解處理器
2.對(duì)注解處理器進(jìn)?編譯,隨后使?注解處理器對(duì)類進(jìn)?編譯
javac -cp ?于引?第三?jar包進(jìn)?編譯)
Person.class,可以發(fā)現(xiàn)Setter?法已經(jīng)?成了:
總結(jié)
推薦閱讀:
SpringBoot異步接口實(shí)現(xiàn):提高系統(tǒng)的吞吐量
實(shí)用指南:解決 SpringBoot 多實(shí)例內(nèi)存不足問(wèn)題
程序員在線工具站:cxytools.com 推薦一個(gè)自己寫的工具站:http://cxytools.com,專為程序員設(shè)計(jì),包括時(shí)間日期、JSON處理、SQL格式化、隨機(jī)字符串生成、UUID生成、文本Hash...等功能,提升開發(fā)效率。
?戳閱讀原文直達(dá)! 朕已閱 ![]()
評(píng)論
圖片
表情
