使用Lombok的@Builder注解,子类在build的时候无法继承父类的属性。
这是一个经典坑!Lombok 的 @Builder 注解在 继承场景 中的存在限制。总结如下:
❗️问题简述
你有如下继承结构:
@Data
@Builder
public class A {
private String name;
}
@Data
@Builder
public class B extends A {
private int age;
}
你希望这样用:
B b = B.builder()
.name("Tom") // ❌ 无法访问 name(A 中的字段)
.age(10)
.build();
⚠️ 但实际上编译会报错:找不到 name() 方法,也就是 A 的字段没有出现在 B 的 Builder 中。
✅ 原因解释
Lombok 的 @Builder 不支持类继承时“自动包含父类字段”。每个类的 @Builder 是独立的,它不会把父类的字段自动带入子类的 builder 方法中。
✅ 解决方案一:使用 Lombok 的 @SuperBuilder(推荐方式)
从 Lombok 1.18.2 开始,官方提供了 @SuperBuilder 用于支持继承链构建器。
✔ 改造代码如下:
import lombok.Data;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
public class A {
private String name;
}
@Data
@SuperBuilder
public class B extends A {
private int age;
}
✅ 使用方式:
B b = B.builder()
.name("Tom") // ✅ 正常访问 A 中字段
.age(10)
.build();
✅ 解决方案二(不推荐):手动写 B 的 Builder 包括 A 的字段
你可以取消 @Builder,手动写一个包含父类字段的构建器,但这违背了使用 Lombok 的初衷。
⚠ 注意事项
| 注意点 | 说明 |
|---|---|
必须在父类和子类都用 @SuperBuilder | 否则 Lombok 无法生成 builder 层级 |
不能和 @Builder 混用 | @Builder 和 @SuperBuilder 不兼容 |
| IDE 可能需要清缓存 / 重启 | Lombok 注解处理依赖 IDE 的 Annotation Processor |
@SuperBuilder 会多生成一个抽象的 builder 父类 | 编译时生成中间 builder 层 |
✅ 总结
| 做法 | 是否推荐 | 原因 |
|---|---|---|
A 和 B 都用 @Builder | ❌ | 不支持继承 |
A 和 B 都用 @SuperBuilder | ✅ | 正确支持父类字段 |
| 手写 builder | ⚠️ 不推荐 | 麻烦,易出错 |