文章目录
问题
最近在导出 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 时,一定要判断对象当前真正的类型。