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

