最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用@Builder導致無法創(chuàng)建無參構造方法的解決

 更新時間:2023年12月15日 15:10:51   作者:搏·夢  
這篇文章主要介紹了使用@Builder導致無法創(chuàng)建無參構造方法的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

1. 前言

在創(chuàng)建實體類的時候,有時候參數過于多,如果使用有參數的構造函數,實在看起來不是很優(yōu)雅,一般都會想使用@Builder構建者模式來進行創(chuàng)建對象,不僅僅優(yōu)雅,而且還方便。

當偶然機會發(fā)現,如果使用了@Builder,該實體類會失去無參構造方法

具體現象如下:

當不加任何注解的時候,完成正常:

當加了@Builder的時候,則會直接出現下面的錯誤,提示沒有無參的構造函數:

2. 先說結論

由于沒有時間深入查看@Builder的源碼,但是可以從編譯之后的字節(jié)碼得出結論: 實體類使用了@Builder,會有全參構造函數,沒有默認無參構造函數,即無法使用默認無參構造函數。

解決方法:

  • 在實體類上同時加上:@Builder、@AllArgsConstructor、@NoArgsConstructor
  • 手寫全部有參構造方法,以及 無參構造方法
  • 手寫個默認無參構造方法,并加上@Tolerate
@Builder
public class demoBuilderEntry {
    private String name;
    private String sex;

    @Tolerate
    public demoBuilderEntry() {
    }
}

3. 演示

若不知道怎么查看java反編譯字節(jié)碼內容,可以看一下:

Java如何進行反編譯生成.java文件(javap、jad下載安裝使用)

1.當實體類不加任何東西:

public class demoBuilderEntry {
    private String name;
    private String sex;
}

可以看見是默認有無參構造函數

public class demoBuilderEntry {

    public demoBuilderEntry() {
    }

    private String name;
    private String sex;
}

2.當實體類加上@Builder注解:

@Builder
public class demoBuilderEntry {
    private String name;
    private String sex;
}

可以看出:無參構造函數已不存在,只剩全參構造函數

public class demoBuilderEntry {
    public static class demoBuilderEntryBuilder {

        public demoBuilderEntryBuilder name(String name) {
            this.name = name;
            return this;
        }

        public demoBuilderEntryBuilder sex(String sex) {
            this.sex = sex;
            return this;
        }

        public demoBuilderEntry build() {
            return new demoBuilderEntry(name, sex);
        }

        public String toString() {
            return (new StringBuilder()).append("demoBuilderEntry.demoBuilderEntryBuilder(name=").append(name).append(", sex=").append(sex).append(")").toString();
        }

        private String name;
        private String sex;

        demoBuilderEntryBuilder() {
        }
    }

    demoBuilderEntry(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public static demoBuilderEntryBuilder builder() {
        return new demoBuilderEntryBuilder();
    }

    private String name;
    private String sex;
}

因此,如下圖,一定會報錯:

有人會說:沒有無參怎么了,也沒有什么事情,反正需要構造。

但像spring這種,我們可以從配置文件中注入屬性,如@ConfigurationProperties,它們的做法是先創(chuàng)建該類對象,使用無參構造函數,然后再調用set方法,此時,你沒有默認無參構造方法,必然會失敗,畢竟連對象都沒有創(chuàng)建成功。

具體失敗案例可以看:實體類使用@Builder,導致@ConfigurationProperties注入屬性失敗

3.如果需要無參構造函數,那就手動添加,在實體類上,再加上@NoArgsConstructor也無效。

根據下圖可以看見,似乎沒有報錯

當運行的時候,則報錯如下:與實際參數列表不符,顯然是無法通過加@NoArgsConstructor創(chuàng)建默認無參構造函數。

4. 解決方法

1. 在實體類上再加上@AllArgsConstructor即可

根據下圖查看,似乎也沒有問題:

點擊運行,查看結果的時候,居然可以運行成功如下:

反手我們去看一下反編譯:

public class demoBuilderEntry {
    public static class demoBuilderEntryBuilder {
        // builder 的代碼省略,沒有粘出來
    }
    
    public static void main(String args[]) {
        System.out.println(new demoBuilderEntry());
    }

    public static demoBuilderEntryBuilder builder() {
        return new demoBuilderEntryBuilder();
    }

    public demoBuilderEntry(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }
	// 無參構造函數有了
    public demoBuilderEntry() {
    }

    private String name;
    private String sex;
}

2. 手寫個無參構造函數并加上@Tolerate

@Tolerate:中文:容許,通俗來說,被該注解加上的方法,讓lombok容許它們存在。

/**
 * Put on any method or constructor to make lombok pretend it doesn't exist,
 * i.e., to generate a method which would otherwise be skipped due to possible conflicts.
 */
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
@Retention(RetentionPolicy.SOURCE)
public @interface Tolerate {
}

測試:

3. 手寫有參無參構造方法

這種方法是最簡單粗暴的,但是代碼可能會沒有那么簡潔:

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • IDEA中git對于指定文件進行版本控制的全過程

    IDEA中git對于指定文件進行版本控制的全過程

    用戶在IDEA中遇到默認提交所有修改的問題,通過配置.gitignore和.git/info/exclude忽略特定文件,并利用vcs.xml指定版本控制范圍,實現精準版本管理,本文通過圖文給大家介紹了IDEA中git對于指定文件進行版本控制的全過程,需要的朋友可以參考下
    2025-05-05
  • java基于odbc連接oracle的實現方法

    java基于odbc連接oracle的實現方法

    這篇文章主要介紹了java基于odbc連接oracle的實現方法,結合實例形式分析了連接操作的具體步驟與相關實現技巧,需要的朋友可以參考下
    2016-09-09
  • Java面試崗常見問題之ArrayList和LinkedList的區(qū)別

    Java面試崗常見問題之ArrayList和LinkedList的區(qū)別

    ArrayList和LinkedList作為我們Java中最常使用的集合類,很多人在被問到他們的區(qū)別時,憋了半天僅僅冒出一句:一個是數組一個是鏈表。這樣回答簡直讓面試官吐血。為了讓兄弟們打好基礎,我們通過實際的使用測試,好好說一下ArrayList和LinkedList的區(qū)別這道經典的面試題
    2022-01-01
  • MyBatis框架關聯映射實例詳解

    MyBatis框架關聯映射實例詳解

    這篇文章主要介紹了MyBatis框架關聯映射,關系映射主要處理復雜的SQl查詢,如子查詢,多表聯查等復雜查詢,應用此種需求時可以考慮使用,需要的朋友可以參考下
    2022-11-11
  • springboot 自定義LocaleResolver實現切換語言

    springboot 自定義LocaleResolver實現切換語言

    我們在做項目的時候,往往有很多項目需要根據用戶的需要來切換不同的語言,使用國際化就可以輕松解決。這篇文章主要介紹了springboot 自定義LocaleResolver切換語言,需要的朋友可以參考下
    2019-10-10
  • maven中的scope與systemPath用法

    maven中的scope與systemPath用法

    這篇文章主要介紹了maven中的scope與systemPath用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • java基于Apache FTP點斷續(xù)傳的文件上傳和下載

    java基于Apache FTP點斷續(xù)傳的文件上傳和下載

    本篇文章主要介紹了java基于Apache FTP點斷續(xù)傳的文件上傳和下載,利用FTP實現文件的上傳和下載,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • 通過實例學習JAVA對象轉成XML輸出

    通過實例學習JAVA對象轉成XML輸出

    這篇文章主要介紹了通過實例學習JAVA對象轉成XML輸出,做流程圖的項目時,新的流程定義為xml的,需要對xml與java對象進行互轉,下面我們來深入學習,需要的朋友可以參考下
    2019-06-06
  • jsp+dao+bean+servlet(MVC模式)實現簡單用戶登錄和注冊頁面

    jsp+dao+bean+servlet(MVC模式)實現簡單用戶登錄和注冊頁面

    這篇文章主要介紹了jsp+dao+bean+servlet(MVC模式)實現簡單用戶登錄和注冊頁面,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot實現性能翻倍的五種配置方案

    SpringBoot實現性能翻倍的五種配置方案

    在當今高并發(fā)的互聯網環(huán)境下,微服務架構的性能優(yōu)化成為了開發(fā)者必須面對的挑戰(zhàn),SpringBoot作為Java生態(tài)中最流行的微服務框架之一,其默認配置雖然能滿足大多數場景需求,但在極端性能要求下往往顯得力不從心,本文將揭示5個常被開發(fā)者忽略的SpringBoot配置項
    2026-01-01

最新評論

山东省| 古交市| 南靖县| 利辛县| 砚山县| 南澳县| 高州市| 洮南市| 静宁县| 孙吴县| 南丰县| 静宁县| 噶尔县| 徐州市| 江孜县| 深州市| 新蔡县| 荥经县| 江华| 宁德市| 长武县| 桐乡市| 浦东新区| 大方县| 绥化市| 阿勒泰市| 成安县| 襄汾县| 岗巴县| 罗源县| 郎溪县| 拉萨市| 修武县| 杭锦旗| 甘肃省| 简阳市| 承德县| 祁连县| 太和县| 绥阳县| 行唐县|