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

相关推荐
神明不懂浪漫1 小时前
【第五章】队列
开发语言·数据结构·经验分享·笔记·算法
吃好睡好便好1 小时前
MATLAB仿真框图3
开发语言·matlab·仿真·simulink
大黄说说1 小时前
Android 本地存储深度对比:SharedPreferences、MMKV、Room 数据库怎么选?
android·数据库
SamChan901 小时前
PDF翻译中的并发控制:用Semaphore防止API限流与资源耗尽
java·jvm·pdf
-银雾鸢尾-2 小时前
C#中的反射关键类-Type
开发语言·c#
大黄说说2 小时前
Java 与 Kotlin 混合开发避坑指南:老项目平滑迁移 Kotlin 实操手册
java·开发语言·kotlin
breeze jiang2 小时前
JavaScript 单例模式:用静态属性保证 Popup 只创建一次
开发语言·javascript·单例模式
snow@li2 小时前
SpringBoot:AOP日志切面全景梳理/原理+流程+实战+避坑
java·开发语言·spring boot
Nil2082 小时前
C++ emplace_back 与 push_back 详解
开发语言·c++