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)文章
spring?boot集成smart-doc自動(dòng)生成接口文檔詳解
這篇文章主要介紹了spring?boot集成smart-doc自動(dòng)生成接口文檔詳解,smart-doc是一款同時(shí)支持java?restful?api和Apache?Dubbo?rpc接口文檔生成的工具,smart-doc顛覆了傳統(tǒng)類(lèi)似swagger這種大量采用注解侵入來(lái)生成文檔的實(shí)現(xiàn)方法2022-09-09
springMVC?@RestControllerAdvice注解使用方式
這篇文章主要介紹了springMVC?@RestControllerAdvice注解使用方式,下面通過(guò)一個(gè)簡(jiǎn)單的示例,演示如何使用?@RestControllerAdvice,感興趣的朋友跟隨小編一起看看吧2024-08-08
Spring Security將用戶數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Spring Security將用戶數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
SpringBoot詳細(xì)分析自動(dòng)裝配原理并實(shí)現(xiàn)starter
相對(duì)于傳統(tǒng)意義上的Spring項(xiàng)目,SpringBoot具有開(kāi)箱即用,簡(jiǎn)化配置,內(nèi)置Tomcat等等等等一系列的特點(diǎn)。在這些特點(diǎn)中,最重要的兩條就是約定優(yōu)于配置和自動(dòng)裝配2022-07-07
使用Java實(shí)現(xiàn)對(duì)兩個(gè)秒級(jí)時(shí)間戳相加
在現(xiàn)代應(yīng)用程序開(kāi)發(fā)中,時(shí)間戳的處理是一個(gè)常見(jiàn)需求,特別是當(dāng)我們需要對(duì)時(shí)間戳進(jìn)行運(yùn)算時(shí),比如時(shí)間戳的相加操作,本文我們將探討如何使用Java對(duì)兩個(gè)秒級(jí)時(shí)間戳進(jìn)行相加,并展示詳細(xì)的代碼示例和運(yùn)行結(jié)果,需要的朋友可以參考下2024-08-08
Java?超詳細(xì)講解Spring?MVC異常處理機(jī)制
Spring?MVC中提供了一個(gè)通用的異常處理機(jī)制,它提供了一個(gè)成熟、簡(jiǎn)潔并且清晰的異常處理方案。當(dāng)使用Spring?MVC開(kāi)發(fā)Web應(yīng)用時(shí),利用這套現(xiàn)成的機(jī)制進(jìn)行異常處理也更加自然并且高效2022-04-04

