java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Lombok @Builder注解的陷阱及解决

Lombok @Builder注解的两大陷阱分析及解决

作者:刘火锅

Lombok的@Builder注解简化了建造者模式的代码编写,但存在两个陷阱:无参构造函数消失和字段默认值失效,通过显式声明构造器和使用@Builder.Default注解,可以解决这些问题

问题概述

Lombok 的 @Builder 注解极大地简化了“建造者模式”的代码编写,但其默认行为存在两个非常隐蔽的陷阱:

陷阱一:无参构造函数消失

现象:当一个类同时使用 @Data 和 @Builder 后,原本可用的无参构造函数 new Entity() 突然不可用,编译报错。

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

现象:在字段声明时设置的默认值(如 String status = “open”;),通过 Builder 创建对象时,若未显式设置该字段,其值将为 null 而非预期的 “open”。

陷阱一:无参构造函数消失

复现步骤

编写一个同时使用 @Data 和 @Builder 的类。

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

尝试在其他地方使用无参构造

User user = new User(); // 编译错误:找不到符号 User()

原因分析

解决方案

显式声明所需的全部构造器,避免 Lombok 的默认行为产生冲突。

@Data
@Builder
@NoArgsConstructor // 显式指定:我需要无参构造
@AllArgsConstructor // 显式指定:我需要全参构造(让Builder直接使用这个现成的)
public class User {
    private String name;
    private Integer age;
}

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

复现步骤

编写一个带有字段默认值的类并使用 Builder。

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

使用 Builder 创建对象,但不设置 status 字段。

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

原因分析

解决方案

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

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

@Builder.Default 的原理:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文