Lombok @Builder 踩坑:build() 前后对象类型不一样

文章目录

问题

最近在导出 Excel 时遇到一个问题。

我定义了一个自定义表头:

java 复制代码
@Data
@Builder
public class CustomHead {

    private String data;
    private Integer width;
    private Boolean hideColumns;
}

使用时写的是:

java 复制代码
headList.add(
    CustomHead.builder()
        .data("创建时间")
        .width(20)
        .build()
);

但是处理代码却是:

java 复制代码
if (head instanceof CustomHead.CustomHeadBuilder builder) {
    CustomHead customHead = builder.build();
    String[] split = customHead.getData().split("->");
    mapHead.put(split[split.length - 1], customHead);
}

结果这个判断没有进去,导致 Excel 的列宽等配置没有生效。

甚至表头显示成了:

text 复制代码
CustomHead(data=创建时间, width=20...)

原因

关键就在 .build()

java 复制代码
CustomHead.builder()

得到的是:

java 复制代码
CustomHeadBuilder

但是:

java 复制代码
CustomHead.builder().build()

得到的是:

java 复制代码
CustomHead

所以我已经 .build() 了,再判断:

java 复制代码
head instanceof CustomHead.CustomHeadBuilder

肯定是 false

应该判断:

java 复制代码
head instanceof CustomHead

修改后

java 复制代码
if (head instanceof CustomHead.CustomHeadBuilder builder) {
    CustomHead customHead = builder.build();
    String[] split = customHead.getData().split("->");
    mapHead.put(split[split.length - 1], customHead);
} else if (head instanceof CustomHead customHead) {
    String[] split = customHead.getData().split("->");
    mapHead.put(split[split.length - 1], customHead);
}

这样无论传入的是:

java 复制代码
CustomHead.builder()

还是:

java 复制代码
CustomHead.builder().build()

都可以正常处理。

总结

记住一句话:

builder()CustomHeadBuilder.build() 之后才是 CustomHead

所以使用 instanceof 时,一定要判断对象当前真正的类型。

相关推荐
wno70422 分钟前
Spring Security权限控制
java·python·spring
杨运交1 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow1 小时前
CountDownLatch in Java
java
SL_staff2 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程2 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff2 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
Bruce_Liuxiaowei3 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
滕州市燕猫虎计算机科技工作室个体工商户3 小时前
IDEA:Command line is too long
java·ide·intellij-idea
BoomHe3 小时前
Android Framework 文件应用移植到 AndroidStudio
android
步行cgn3 小时前
Spring p 命名空间注入详解
java·前端·spring