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

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

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

問(wèn)題概述

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

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

現(xiàn)象:當(dāng)一個(gè)類(lèi)同時(shí)使用 @Data 和 @Builder 后,原本可用的無(wú)參構(gòu)造函數(shù) new Entity() 突然不可用,編譯報(bào)錯(cuò)。

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

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

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

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

編寫(xiě)一個(gè)同時(shí)使用 @Data 和 @Builder 的類(lèi)。

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

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

User user = new User(); // 編譯錯(cuò)誤:找不到符號(hào) User()

原因分析

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

解決方案

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

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

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

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

編寫(xiě)一個(gè)帶有字段默認(rèn)值的類(lèi)并使用 Builder。

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

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

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

原因分析

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

解決方案

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

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

@Builder.Default 的原理:

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    通過(guò)Java實(shí)現(xiàn)帶干擾線(xiàn)的驗(yàn)證碼

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

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

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

    Java中緩存的使用及使用場(chǎng)景淺講

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

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

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

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

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

    解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題

    這篇文章主要介紹了解決沒(méi)有@RunWith 和 @SpringBootTest注解或失效問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • 如何在Spring Boot 項(xiàng)目中自定義 Validation 注解

    如何在Spring Boot 項(xiàng)目中自定義 Validation 注解

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

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

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

最新評(píng)論

吉隆县| 沁源县| 丹寨县| 河池市| 资中县| 松潘县| 永清县| 昌邑市| 漠河县| 祁连县| 兴城市| 富裕县| 祥云县| 尤溪县| 中江县| 米易县| 永川市| 龙南县| 万年县| 广河县| 潢川县| 盱眙县| 阿城市| 通化市| 车险| 五峰| 延川县| 兴安盟| 成安县| 永登县| 万州区| 东辽县| 临武县| 海口市| 洪湖市| 普洱| 田东县| 城口县| 呼伦贝尔市| 扎囊县| 准格尔旗|