Java的Lombok之@Builder使用總結(jié)
@Builder使用總結(jié)
一. @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的有參構(gòu)造函數(shù),入?yún)⒉粌H包括T1中所有的參數(shù),還包括T中所有的參數(shù)。
T2的屬性由T1在有參構(gòu)造函數(shù)中通過調(diào)用父類構(gòu)造器的方式賦初值。
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自動生成的構(gòu)造函數(shù)(比如使用@AllArgsConstructor或@NoArgsConstructor或@RequiredArgsConstructor等)中為age賦予了初值,而且還在T2Builder中也為其賦予了初值。因此,以下兩種方式都能得到正確的結(jié)果:
System.out.println(T2.builder().build().getPp()); System.out.println(new T2().getPp());
但一旦涉及到繼承,此方法就不能使用了。從場景1(@Builder與繼承共存)中,我們知道了想要兼容繼承關(guān)系,@Builder不能加到類上,但實際上,@Builder.Default必須使用在一個被@Builder標(biāo)識的類中,因此@Builder.Default注解用不了了。
那該怎么辦呢?很簡單,我們在T1的有參構(gòu)造函數(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;
}到此這篇關(guān)于Java的Lombok之@Builder使用總結(jié)的文章就介紹到這了,更多相關(guān)@Builder使用總結(jié)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot使用CORS解決無法跨域訪問問題的具體步驟
跨域問題指的是不同站點之間,使用 ajax 無法相互調(diào)用的問題,跨域問題本質(zhì)是瀏覽器的一種保護(hù)機制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù),本文給大家介紹了SpringBoot使用CORS解決無法跨域訪問問題的具體步驟,需要的朋友可以參考下2025-05-05
SpringBoot使用swagger生成api接口文檔的方法詳解
在之前的文章中,使用mybatis-plus生成了對應(yīng)的包,在此基礎(chǔ)上,我們針對項目的api接口,添加swagger配置和注解,生成swagger接口文檔,需要的可以了解一下2022-10-10
java通過jacob實現(xiàn)office在線預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了java通過jacob實現(xiàn)office在線預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08
mybatis的ParamNameResolver參數(shù)名稱解析
這篇文章主要為大家介紹了mybatis的ParamNameResolver參數(shù)名稱解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Java 8 Function函數(shù)式接口及函數(shù)式接口實例
函數(shù)式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。接下來通過本文給大家介紹Java 8 Function函數(shù)式接口及函數(shù)式接口實例代碼,需要的朋友可以參考下2018-05-05
kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明
這篇文章主要介紹了kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05

