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

Java的Lombok之@Builder使用總結

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

@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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中的volatile關鍵字解析

    Java中的volatile關鍵字解析

    這篇文章主要介紹了Java中的volatile關鍵字解析,Java內(nèi)存模型規(guī)定了所有的變量都存儲在主內(nèi)存中,每個線程都有自己的工作內(nèi)存,線程的工作內(nèi)存保存了該線程使用到的變量的是主內(nèi)存副本的拷貝,需要的朋友可以參考下
    2023-11-11
  • 詳解SpringMVC解決跨域的兩種方案

    詳解SpringMVC解決跨域的兩種方案

    本篇文章主要介紹了詳解SpringMVC解決跨域的兩種方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • SpringCloud整合Netty集群實現(xiàn)WebSocket的示例代碼

    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
  • Java 覆蓋equals時總要覆蓋hashcode

    Java 覆蓋equals時總要覆蓋hashcode

    這篇文章主要介紹了Java 覆蓋equals時總要覆蓋hashcode的相關資料,這里附有實例代碼,具有參考價值,需要的朋友可以參考下
    2016-12-12
  • 劍指Offer之Java算法習題精講字符串操作與數(shù)組及二叉搜索樹

    劍指Offer之Java算法習題精講字符串操作與數(shù)組及二叉搜索樹

    跟著思路走,之后從簡單題入手,反復去看,做過之后可能會忘記,之后再做一次,記不住就反復做,反復尋求思路和規(guī)律,慢慢積累就會發(fā)現(xiàn)質(zhì)的變化
    2022-03-03
  • 詳解SpringMVC 基礎教程 簡單入門實例

    詳解SpringMVC 基礎教程 簡單入門實例

    這篇文章主要介紹了詳解SpringMVC 基礎教程 簡單入門實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • Spring?Security+JWT簡述(附源碼)

    Spring?Security+JWT簡述(附源碼)

    SpringSecurity是一個強大的可高度定制的認證和授權框架,對于Spring應用來說它是一套Web安全標準,下面這篇文章主要給大家介紹了關于Spring?Security+JWT簡述的相關資料,需要的朋友可以參考下
    2023-04-04
  • java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法

    java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法

    這篇文章主要介紹了java實現(xiàn)字符串和日期類型相互轉(zhuǎn)換的方法,涉及java針對日期與字符串的轉(zhuǎn)換與運算相關操作技巧,需要的朋友可以參考下
    2017-02-02
  • Spring Security使用數(shù)據(jù)庫認證及用戶密碼加密和解密功能

    Spring Security使用數(shù)據(jù)庫認證及用戶密碼加密和解密功能

    這篇文章主要介紹了Spring Security使用數(shù)據(jù)庫認證及用戶密碼加密和解密,本文通過代碼與截圖的形式給大家介紹的非常詳細,對大家的工作或?qū)W習具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • java 實現(xiàn)當前時間加減30分鐘的時間代碼

    java 實現(xiàn)當前時間加減30分鐘的時間代碼

    這篇文章主要介紹了java 實現(xiàn)當前時間加減30分鐘的時間代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08

最新評論