
Lombok 的 @Builder 注解默认不支持继承链中的字段复用,导致子类构建器无法访问父类字段;本文介绍使用实验性注解 @SuperBuilder 实现父子类字段统一构建,并提供完整配置与注意事项。
lombok 的 `@builder` 注解默认不支持继承链中的字段复用,导致子类构建器无法访问父类字段;本文介绍使用实验性注解 `@superbuilder` 实现父子类字段统一构建,并提供完整配置与注意事项。
在使用 Lombok 构建器(@Builder)时,若子类继承自带有 @Builder 的父类(如 B extends A),你会发现子类的 Builder 并不会自动包含父类的字段方法(例如 .itemInfo(...)),编译报错 Create method 'itemInfo' in 'BBuilder' 正是这一限制的典型表现——因为标准 @Builder 为每个类生成独立的、非继承的构建器类型。
✅ 正确解决方案:启用 Lombok 实验性功能 @SuperBuilder
@SuperBuilder 是 Lombok 提供的专门用于支持继承式构建的注解。它会为整个继承链生成层级化的构建器类(如 ABuilder、BBuilder),并确保子类构建器能链式调用父类字段的 setter 方法。
? 使用步骤如下:
-
移除所有
@Builder,替换为@SuperBuilder(父类和子类均需标注):
@Getter
@Setter
@ToString
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@EqualsAndHashCode
@SuperBuilder // ✅ 替换 @Builder
public class A {
private ItemInfo itemInfo;
public boolean hasErrors() {
return itemInfo != null && itemInfo.hasErrors();
}
}
@Getter
@Setter
@ToString
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@EqualsAndHashCode
@SuperBuilder // ✅ 子类也必须加
public class B extends A {
private Price bestPrice;
private Price alternativePrice;
}- 构建时即可无缝使用父类字段:
B mocked = B.builder()
.itemInfo(null) // ✅ 现在可用!来自 A
.bestPrice(null) // ✅ 来自 B
.alternativePrice(null) // ✅ 来自 B
.build();⚠️ 注意事项:
-
@SuperBuilder是实验性特性(experimental),需确认你使用的 Lombok 版本 ≥ 1.18.2(推荐 ≥ 1.18.30); - 必须为整个继承链中所有参与构建的类显式添加
@SuperBuilder,缺一不可; - 不支持与
@Builder混用;也不兼容@AllArgsConstructor/@RequiredArgsConstructor的builder()方法生成逻辑(@SuperBuilder会忽略这些构造器注解的 builder 相关行为); - 若父类有
@Builder.Default字段,其默认值逻辑在@SuperBuilder下仍有效,但需确保初始化方式兼容(建议统一用@SuperBuilder管理)。
? 小贴士:启用 Lombok 实验特性需在 lombok.config 中添加(可选,部分 IDE 可能需要):
lombok.anyConstructor.addConstructorProperties = true # 启用 SuperBuilder(Lombok 1.18.20+ 默认开启,旧版可显式声明) lombok.experimental.superBuilder = true
总结:当面对继承结构下的构建器需求时,@SuperBuilder 是目前 Lombok 生态中最简洁、类型安全且符合面向对象直觉的解决方案。它让构建器真正“理解”继承关系,避免手动编写冗余构建逻辑或放弃 Lombok 带来的开发效率。

















