欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的Lombok之@Builder使用總結(jié)

 更新時間:2023年12月15日 10:06:18   作者:愛喝咖啡的程序員  
這篇文章主要介紹了Java的Lombok之@Builder使用總結(jié),當(dāng)不使用@Builder注解到類上,創(chuàng)建T1的有參構(gòu)造函數(shù),入?yún)⒉粌H包括T1中所有的參數(shù),還包括T中所有的參數(shù),T2的屬性由T1在有參構(gòu)造函數(shù)中通過調(diào)用父類構(gòu)造器的方式賦初值,需要的朋友可以參考下

@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)文章

  • Spring Boot Mybatis++ 2025詳解

    Spring Boot Mybatis++ 2025詳解

    文章介紹了三種基于注解SQL和查詢接口的MyBatis使用方式,討論了Entity和Example的區(qū)別,即Entity會更新所有字段,而Example僅更新非空字段,感興趣的朋友一起看看吧
    2025-02-02
  • SpringBoot使用CORS解決無法跨域訪問問題的具體步驟

    SpringBoot使用CORS解決無法跨域訪問問題的具體步驟

    跨域問題指的是不同站點之間,使用 ajax 無法相互調(diào)用的問題,跨域問題本質(zhì)是瀏覽器的一種保護(hù)機制,它的初衷是為了保證用戶的安全,防止惡意網(wǎng)站竊取數(shù)據(jù),本文給大家介紹了SpringBoot使用CORS解決無法跨域訪問問題的具體步驟,需要的朋友可以參考下
    2025-05-05
  • 在netty中使用native傳輸協(xié)議的方法

    在netty中使用native傳輸協(xié)議的方法

    這篇文章主要介紹了在netty中使用native傳輸協(xié)議,這里我們只以Kqueue為例介紹了netty中native傳輸協(xié)議的使用,需要的朋友可以參考下
    2022-05-05
  • 一文教你如何更改IDEA已有項目的路徑/名稱

    一文教你如何更改IDEA已有項目的路徑/名稱

    由于IDEA項目路徑中有中文、空格等特殊符號,影響正常使用,想要修改路徑名稱,怎么正確修改IDEA項目名稱,使其正常運行呢?所以本文小編講給大家詳細(xì)的介紹了更改IDEA已有項目的路徑/名稱解決方案,需要的朋友可以參考下
    2023-11-11
  • SpringBoot使用swagger生成api接口文檔的方法詳解

    SpringBoot使用swagger生成api接口文檔的方法詳解

    在之前的文章中,使用mybatis-plus生成了對應(yīng)的包,在此基礎(chǔ)上,我們針對項目的api接口,添加swagger配置和注解,生成swagger接口文檔,需要的可以了解一下
    2022-10-10
  • java通過jacob實現(xiàn)office在線預(yù)覽功能

    java通過jacob實現(xiàn)office在線預(yù)覽功能

    這篇文章主要為大家詳細(xì)介紹了java通過jacob實現(xiàn)office在線預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • SpringBoot整合knife4j實踐

    SpringBoot整合knife4j實踐

    這篇文章主要介紹了SpringBoot整合knife4j實踐,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • mybatis的ParamNameResolver參數(shù)名稱解析

    mybatis的ParamNameResolver參數(shù)名稱解析

    這篇文章主要為大家介紹了mybatis的ParamNameResolver參數(shù)名稱解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • Java 8 Function函數(shù)式接口及函數(shù)式接口實例

    Java 8 Function函數(shù)式接口及函數(shù)式接口實例

    函數(shù)式接口(Functional Interface)就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。接下來通過本文給大家介紹Java 8 Function函數(shù)式接口及函數(shù)式接口實例代碼,需要的朋友可以參考下
    2018-05-05
  • kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明

    kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明

    這篇文章主要介紹了kafka?消息隊列中點對點與發(fā)布訂閱的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05

最新評論