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 时,一定要判断对象当前真正的类型。

相关推荐
夏幻灵5 小时前
JavaScript this 面试:五种绑定规则、优先级与常见面试陷阱
开发语言·javascript·面试
程序猿编码6 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
aqi007 小时前
鸿蒙版本的电子书阅读APP开放源码啦
android·华为·ai编程·harmonyos·鸿蒙
墨天梦7 小时前
B19_SunnyWeather到阅读客户端
android·kotlin
bkspiderx7 小时前
Qt 插件机制:动态扩展应用功能的核心框架
开发语言·qt·元数据·qt 插件·qpluginloader
代码什么用7 小时前
Spring基础使用
java·后端·spring
程序员老陆7 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
沐晓时光7 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
Su米苏8 小时前
Spring AI 中MCP 与普通 @Tool的区别
java·人工智能·spring
美狐美颜sdk8 小时前
直播APP源码可以直接接入视频美颜sdk吗?技术方案详解
android·人工智能·音视频·美颜sdk·直播美颜sdk