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

Lombok @Builder注解的兩大陷阱分析及解決

 更新時間:2026年01月14日 16:08:25   作者:劉火鍋  
Lombok的@Builder注解簡化了建造者模式的代碼編寫,但存在兩個陷阱:無參構(gòu)造函數(shù)消失和字段默認值失效,通過顯式聲明構(gòu)造器和使用@Builder.Default注解,可以解決這些問題

問題概述

Lombok 的 @Builder 注解極大地簡化了“建造者模式”的代碼編寫,但其默認行為存在兩個非常隱蔽的陷阱:

陷阱一:無參構(gòu)造函數(shù)消失

現(xiàn)象:當一個類同時使用 @Data 和 @Builder 后,原本可用的無參構(gòu)造函數(shù) new Entity() 突然不可用,編譯報錯。

陷阱二:字段默認值(初始化)失效

現(xiàn)象:在字段聲明時設(shè)置的默認值(如 String status = “open”;),通過 Builder 創(chuàng)建對象時,若未顯式設(shè)置該字段,其值將為 null 而非預(yù)期的 “open”。

陷阱一:無參構(gòu)造函數(shù)消失

復(fù)現(xiàn)步驟

編寫一個同時使用 @Data 和 @Builder 的類。

@Data
@Builder
public class User {
    private String name;
    private Integer age;
}

嘗試在其他地方使用無參構(gòu)造

User user = new User(); // 編譯錯誤:找不到符號 User()

原因分析

  • @Data 會生成一個 @RequiredArgsConstructor。如果類中沒有 final 或@NonNull 的字段,這個構(gòu)造器就是無參的。此時,單獨使用 @Data 是完全可以無參構(gòu)造的。
  • @Builder 注解需要基于一個全參構(gòu)造函數(shù)來工作。當它發(fā)現(xiàn)你沒有顯式提供任何構(gòu)造器時,它會主動生成一個私有的、包含所有字段的全參構(gòu)造函數(shù)。
  • @Builder 的生成行為取代了 @Data 生成 @RequiredArgsConstructor 的邏輯。最終,編譯后的類中只剩下 @Builder 生成的私有全參構(gòu)造器,導(dǎo)致無參構(gòu)造器確實“消失”了。

解決方案

顯式聲明所需的全部構(gòu)造器,避免 Lombok 的默認行為產(chǎn)生沖突。

@Data
@Builder
@NoArgsConstructor // 顯式指定:我需要無參構(gòu)造
@AllArgsConstructor // 顯式指定:我需要全參構(gòu)造(讓Builder直接使用這個現(xiàn)成的)
public class User {
    private String name;
    private Integer age;
}

陷阱二:字段默認值(初始化)失效

復(fù)現(xiàn)步驟

編寫一個帶有字段默認值的類并使用 Builder。

@Data
@Builder
public class Order {
    private Long id;
    private String status = "open"; // 期望的默認值
}

使用 Builder 創(chuàng)建對象,但不設(shè)置 status 字段。

Order order = Order.builder().id(1L).build();
System.out.println(order.getStatus()); // 輸出:null (預(yù)期是 "open")

原因分析

  • 字段的默認值 = "open"是在類的構(gòu)造函數(shù)內(nèi)部執(zhí)行的。
  • @Builder 的 build() 方法本質(zhì)上是調(diào)用了類的全參構(gòu)造函數(shù),并將 Builder 對象內(nèi)部的字段值作為參數(shù)傳入。關(guān)鍵點在于:構(gòu)造函數(shù)會無條件使用傳入的參數(shù)。
  • 如果你沒有調(diào)用 .status(…) 方法,Builder 對象內(nèi)部的 status 字段值就是 null。在調(diào)用 build() 時,執(zhí)行的是 new Order(id, status),這個 null 被傳入了構(gòu)造函數(shù),完全覆蓋了類定義中 = “open” 的初始化操作。

解決方案

使用 Lombok 提供的 @Builder.Default 注解。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Order {
    private Long id;
    
    @Builder.Default // 使用此注解標記
    private String status = "open";
}

@Builder.Default 的原理:

  • 它會指示 Lombok 在生成的 Builder 類中,預(yù)先將這個字段初始化為指定的默認值。
  • 如果后續(xù)沒有顯式設(shè)置該字段,build() 方法就會使用這個預(yù)先存在的默認值,而不是 null。

總結(jié)

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

相關(guān)文章

  • Java連接并操作Sedna XML數(shù)據(jù)庫的方法

    Java連接并操作Sedna XML數(shù)據(jù)庫的方法

    這篇文章主要介紹了Java連接并操作Sedna XML數(shù)據(jù)庫的方法,較為詳細的說明了Sedna XML數(shù)據(jù)庫的原理與功能,并給出了基于java操作Sedna XML數(shù)據(jù)庫的方法,需要的朋友可以參考下
    2015-06-06
  • Springboot Redis?哨兵模式的實現(xiàn)示例

    Springboot Redis?哨兵模式的實現(xiàn)示例

    本文主要介紹了Springboot Redis?哨兵模式的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 通過Java實現(xiàn)帶干擾線的驗證碼

    通過Java實現(xiàn)帶干擾線的驗證碼

    帶干擾線的驗證碼是一種常見的安全驗證方式,目的是通過圖像中的干擾線增加機器識別的難度,確保只有人類用戶能夠順利識別并輸入驗證碼,本項目的目的是通過Java實現(xiàn)一個帶有干擾線的驗證碼生成器,需要的朋友可以參考下
    2025-02-02
  • Java String源碼分析并介紹Sting 為什么不可變

    Java String源碼分析并介紹Sting 為什么不可變

    這篇文章主要介紹了Java String源碼分析并介紹Sting 為什么不可變的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java中緩存的使用及使用場景淺講

    Java中緩存的使用及使用場景淺講

    Java緩存是指為了提高數(shù)據(jù)訪問速度,在內(nèi)存中存儲數(shù)據(jù)副本的一種技術(shù),這篇文章主要介紹了Java中緩存使用及使用場景的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • java解析Excel的方法(xls、xlsx兩種格式)

    java解析Excel的方法(xls、xlsx兩種格式)

    這篇文章主要介紹了java解析Excel的方法(xls、xlsx兩種格式),需要的朋友可以參考下
    2018-04-04
  • 解析Spring事件發(fā)布與監(jiān)聽機制

    解析Spring事件發(fā)布與監(jiān)聽機制

    本篇文章給大家介紹Spring事件發(fā)布與監(jiān)聽機制,通過 ApplicationEvent 事件類和 ApplicationListener 監(jiān)聽器接口,可以實現(xiàn) ApplicationContext 事件發(fā)布與處理,需要的朋友參考下吧
    2021-06-06
  • 解決沒有@RunWith 和 @SpringBootTest注解或失效問題

    解決沒有@RunWith 和 @SpringBootTest注解或失效問題

    這篇文章主要介紹了解決沒有@RunWith 和 @SpringBootTest注解或失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 如何在Spring Boot 項目中自定義 Validation 注解

    如何在Spring Boot 項目中自定義 Validation 注解

    本文詳解SpringBoot自定義Validation注解實現(xiàn)流程,包括定義注解、編寫校驗邏輯、應(yīng)用注解及異常處理,支持多地區(qū)手機號格式校驗和復(fù)雜業(yè)務(wù)規(guī)則,提升數(shù)據(jù)合法性校驗?zāi)芰?適用于微服務(wù)架構(gòu)參數(shù)校驗實踐,感興趣的朋友一起看看吧
    2025-07-07
  • Java獲得元素屬性的注解信息的步驟

    Java獲得元素屬性的注解信息的步驟

    在Java編程中,注解是一種為代碼添加元數(shù)據(jù)的方式,通過反射機制,我們可以獲取元素屬性上的注解信息,這個過程對于框架開發(fā)和元數(shù)據(jù)處理非常有用,能夠?qū)崿F(xiàn)更靈活的功能,對java獲得元素屬性的注解信息相關(guān)知識感興趣的朋友一起看看吧
    2024-09-09

最新評論

镇江市| 西华县| 日土县| 肇州县| 确山县| 元朗区| 宣武区| 巧家县| 仁怀市| 丰宁| 五寨县| 谷城县| 武隆县| 城口县| 新丰县| 酉阳| 托里县| 渝北区| 屏东县| 长顺县| 三穗县| 佛冈县| 烟台市| 遂昌县| 定结县| 诏安县| 延川县| 浦江县| 武城县| 乌海市| 宁明县| 伊宁市| 柳林县| 阿合奇县| 益阳市| 屏边| 合肥市| 镇巴县| 无锡市| 调兵山市| 罗定市|