当前位置: 首页 > news >正文

Java | Lombok @Builder.Default 排障指南:为什么 build 时默认值丢失?

关注:CodingTechWork

引言

在 Java 项目中,使用 Lombok 的 @Builder 注解可以让我们用链式调用快速创建对象。通常我们会为一些字段在类中直接设置默认值:

public class User {private String name = "defaultName";private int age = 18;
}

直接用 new User() 创建对象时,这些字段就会有默认值。但当我们使用 @Builder 构建对象时,发现这些默认值“消失”了:

@Builder
public class User {private String name = "defaultName";private int age = 18;
}public class Main {public static void main(String[] args) {User user = User.builder().build();System.out.println(user.getName()); // 输出 nullSystem.out.println(user.getAge());  // 输出 0}
}

问题分析:@Builder 和默认值冲突的原因

Lombok 的 @Builder 注解会生成一个独立的 Builder 类。Builder 类中,每个字段都会有自己的存储变量,当你调用 build() 时,会用 Builder 内部存储的值来创建对象。

关键点

  1. Builder 内部的字段默认值是 Java 类型默认值,而不是类字段的默认值。
  2. 所以即使你在类中给字段写了 private String name = "defaultName";,Builder 也不会去读取这个默认值。
  3. 如果你在 build() 之前没有调用对应的 setter 方法,这个字段就会保持 Builder 内部的默认值(String 为 null,int 为 0)。

解决方案:使用 @Builder.Default

Lombok 提供了 @Builder.Default 注解,专门用来解决这个问题。它会告诉 Builder,在构建对象时如果没有显式设置值,使用字段的初始化值作为默认值。

修改后的示例:

@Builder
public class User {@Builder.Defaultprivate String name = "defaultName";@Builder.Defaultprivate int age = 18;
}public class Main {public static void main(String[] args) {User user = User.builder().build();System.out.println(user.getName()); // 输出 defaultNameSystem.out.println(user.getAge());  // 输出 18}
}

工作原理:

  1. @Builder.Default 会在 Builder 类中生成一个 默认值初始化逻辑
  2. 当 build() 被调用时,如果 Builder 中没有设置这个字段,则使用默认值初始化字段。
  3. 如果 Builder 已经通过链式调用设置了值,则使用用户设置的值。

常见错误与注意事项

  1. 忘记加 @Builder.Default
@Builder
private String name = "defaultName"; // ❌ 错误

这种写法不会生效,build 后仍然是 null。

  1. 与 @NonNull 冲突
@Builder
@NonNull
@Builder.Default
private String name = "defaultName"; // ❌ Lombok 会报错

@NonNull@Builder.Default 不要同时使用,因为默认值初始化逻辑可能与非空检查冲突。

  1. 不要在构造器里重复初始化

如果你同时有全参构造器或者 @AllArgsConstructor 初始化字段,Builder 默认值可能不会生效。建议依赖 @Builder.Default 的初始化逻辑。

总结

  • 在类中直接给字段赋值,new 时会生效。
  • 使用 @Builder 构建对象时,类字段的默认值不会生效。
  • 解决方案是为字段添加 @Builder.Default 注解。
  • 注意与 @NonNull 或自定义构造器的冲突。

通过 @Builder.Default,我们就能让 Builder 构建对象时也保留默认值,从而避免 build 出来的对象字段为 null 或 0 的问题。

http://www.dtcms.com/a/516768.html

相关文章:

  • 东莞网站快速优化排名中国品牌网站建设
  • 计算机网络 网站代理公司注册新公司的费用
  • Linux下的TCP滑动窗口
  • 从CCLKIE到EtherCAT:汇川PLC在大型选矿厂的伺服通讯升级之路
  • wordpress 建站 知乎app开发app制作公司
  • wordpress代码创建子站点建设谷歌公司网站费用
  • 多资产回测实战 | 用 DolphinDB 搭建股票期货对冲与期权套利策略
  • 企业营销管理软件网站优化查询
  • 数字孪生大屏实战:山海鲸可视化如何让制造业‘透明化
  • Linux 内存 --- get_user_pages/pin_user_pages函数
  • 《探索 Docker+Neko+cpolar 实现跨网共享浏览器的无限可能》
  • 调用百度云语音识别服务——实现c++接口识别语音
  • 浅谈常见的八类数据库加密技术
  • Beyond Compare 5 for Mac 好用的文件对比工具
  • 济南专业做网站公司哪家好做爰全过程免费的视频凤凰网站
  • 顶俏模式分析:低价洗衣液与三级分销机制的市场争议
  • 云服务器网站解析专业拓客团队怎么收费
  • 嘉兴网站建设网站海报设计兼职平台
  • 标准网站建设费用阿里企业邮箱怎么用
  • 西宁市城乡规划建设局网站海外网络推广方案
  • VMware替代 | ZStack ZSphere镜像与模板管理在迁移与运维中的关键作用
  • 【C++ 入门】:从语言发展脉络到实战细节 —— 详解命名空间、输入输出、缺省参数与函数重载
  • 搜网站首页不见了seowordpress 简书主题
  • 【开题答辩全过程】以 冰雪装备租赁平台系统设计与实现为例,包含答辩的问题和答案
  • 解锁数字时代安全密码:ICP许可证安全测评解析
  • 简约网站建设常见搜索引擎有哪些
  • 宁波定制网站建设自己做广告用什么软件
  • 经典文献阅读之--UniScene(统一的以占用为中心的驾驶场景生成)
  • Java学习之旅第三季-14:代理
  • 深度学习YOLO实战:7、摄像头实时目标检测完整实践