聊聊使用lombok @Builder踩到的坑
前言
什么是lombok
Lombok项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。
对lombok不熟悉的朋友,可以阅读一下官方文档,再来看本文。官方文档如下
正文
我们先来看一个小例子
提问: main函数会输出什么?
答案:空指针异常
Exception in thread "main" java.lang.NullPointerException
at com.github.lybgeek.msg.test.User.addPositionList(User.java:25)
at com.github.lybgeek.msg.test.User.main(User.java:30)
回答出正确答案的朋友,下文基本上可以不用看了。可能有些朋友会有疑问,我例子中明明使用了
private List<String> positionList = new ArrayList<>();
为什么还会报空指针?
真相就在lombok用@builder生成的class文件中,我们看下使用@builder,生成的class文件反编译后长啥样
看到我圈红起来的,大家应该就一目了然。原来当我们用
User user = User.builder().username("张三").build();
时,此时user对象中的positionList就会被userBuilder中的positionList覆盖,而userBuilder中的positionList是null
如何解决
方法一:positionList前面加上final修饰
private final List<String> positionList = new ArrayList<>();
此时用@Budiler生成class为
此时user对象中的positionList用的还是原先的positionList,因此不会出现空指针异常
方法二:positionList前面加上@Builder.Default注解
@Builder.Default
private List<String> positionList = new ArrayList<>();
此时用@Budiler生成class为
public static class UserBuilder {
private String username;
private boolean positionList$set;
private List<String> positionList;
UserBuilder() {
}
public User.UserBuilder username(final String username) {
this.username = username;
return this;
}
public User.UserBuilder positionList(final List<String> positionList) {
this.positionList = positionList;
this.positionList$set = true;
return this;
}
public User build() {
List<String> positionList = this.positionList;
if (!this.positionList$set) {
positionList = User.$default$positionList();
}
return new User(this.username, positionList);
}
当positionList$set为false,会给userBuilder的positionList赋值为
User.$default$positionList();
即:
private static List<String> $default$positionList() {
return new ArrayList();
}
因此当user对象中的positionList被userBuilder中的positionList覆盖后,userBuilder中的positionList是new ArrayList(),此时就不会出现空指针现象
方法三:不用build实例化对象
把
User user = User.builder().username("张三").build();
改成用
User user = new User();
user.setUsername("张三");
user.addPositionList("经理");
总结
很多时候没那么多的想当然
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探