Lombok 的 @Builder继承问题

289 阅读1分钟

使用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⚠️ 不推荐麻烦,易出错