Java的Lombok之@Builder使用總結
@Builder使用總結
一. @Builder與繼承共存
我所使用的Lombok版本是1.18.8
截止1.18.8版本,使用了@Builder注解的類仍然無法使用繼承,
public class Test { public static void main(String[] args) { T1.builder().build(); } } @Builder @AllArgsConstructor @NoArgsConstructor @Setter @Getter class T1 extends T2{ private String name; private Integer age; } @Builder @AllArgsConstructor @NoArgsConstructor @Getter @Setter class T2{ protected String pp; }
報錯:
Error:(19, 1) java: com.mmr.learn.T1中的builder()無法覆蓋com.mmr.learn.T2中的builder()
返回類型com.mmr.learn.T1.T1Builder與com.mmr.learn.T2.T2Builder不兼容
解決方案:
不使用@Builder注解到類上,創(chuàng)建T1的有參構造函數(shù),入?yún)⒉粌H包括T1中所有的參數(shù),還包括T中所有的參數(shù)。
T2的屬性由T1在有參構造函數(shù)中通過調(diào)用父類構造器的方式賦初值。
public class Test { public static void main(String[] args) { T1 t1 = T1.builder().name("java").pp("world").build(); System.out.println(t1.getName()); System.out.println(t1.getAge()); System.out.println(t1.getPp()); } } @AllArgsConstructor @NoArgsConstructor @Setter @Getter class T1 extends T2{ private String name; private Integer age; @Builder(toBuilder = true) public T1(String pp, String name, Integer age) { super(pp); this.name = name; this.age = age; } } @AllArgsConstructor @NoArgsConstructor @Getter @Setter class T2{ protected String pp; }
二. @Builder與屬性賦初值
就拿上面的案例來看,如果想對age賦初值,網(wǎng)上有的人將@Builder.Default 注解添加到待賦值屬性上,如下圖所示:
@Builder.Default private Integer age = 26;
在不涉及繼承的場景中,這樣用沒有問題,因為@Builder.Default會為age在編譯期間單獨生成一個$default$age的方法,不僅在T1類內(nèi)所有由Lombok自動生成的構造函數(shù)(比如使用@AllArgsConstructor或@NoArgsConstructor或@RequiredArgsConstructor等)中為age賦予了初值,而且還在T2Builder中也為其賦予了初值。因此,以下兩種方式都能得到正確的結果:
System.out.println(T2.builder().build().getPp()); System.out.println(new T2().getPp());
但一旦涉及到繼承,此方法就不能使用了。從場景1(@Builder與繼承共存)中,我們知道了想要兼容繼承關系,@Builder不能加到類上,但實際上,@Builder.Default必須使用在一個被@Builder標識的類中,因此@Builder.Default注解用不了了。
那該怎么辦呢?很簡單,我們在T1的有參構造函數(shù)中賦初值即可。
public class Test { public static void main(String[] args) { //輸出: 25 System.out.println(T1.builder().build().getAge()); //輸出: 26 System.out.println(new T1().getAge()); } } @AllArgsConstructor @NoArgsConstructor @Setter @Getter class T1 extends T2{ private String name; private Integer age = 26; @Builder(toBuilder = true) public T1(String pp, String name, Integer age) { super(pp); this.name = name; if(null == age){ this.age = 25; }else{ this.age = age; } } } @AllArgsConstructor @NoArgsConstructor @Getter @Setter class T2{ protected String pp; }
到此這篇關于Java的Lombok之@Builder使用總結的文章就介紹到這了,更多相關@Builder使用總結內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringCloud整合Netty集群實現(xiàn)WebSocket的示例代碼
文章主要介紹了SpringCloud整合Netty集群實現(xiàn)WebSocket的相關內(nèi)容,包括服務注冊和發(fā)現(xiàn)中心的配置,如使用Nacos、CommandLineRunner啟動Netty服務等,還介紹了通過Redis實現(xiàn)消息發(fā)布訂閱的機制,需要的朋友可以參考下2024-11-11劍指Offer之Java算法習題精講字符串操作與數(shù)組及二叉搜索樹
跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化2022-03-03java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法
這篇文章主要介紹了java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法,涉及java針對日期與字符串的轉(zhuǎn)換與運算相關操作技巧,需要的朋友可以參考下2017-02-02Spring Security使用數(shù)據(jù)庫認證及用戶密碼加密和解密功能
這篇文章主要介紹了Spring Security使用數(shù)據(jù)庫認證及用戶密碼加密和解密,本文通過代碼與截圖的形式給大家介紹的非常詳細,對大家的工作或?qū)W習具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03