You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子类B继承父类A后,Builder无法调用父类属性itemInfo怎么办?

问题原因

Lombok的@Builder注解默认仅生成当前类字段的Builder方法,不会自动将父类的字段集成到子类的Builder中。所以子类B的Builder里没有父类A的itemInfo属性对应的设置方法,调用.itemInfo(null)就会报错。

解决方案

推荐使用Lombok专门为继承场景设计的@SuperBuilder注解替代@Builder,具体步骤如下:

1. 修改父类A的注解

将父类A的@Builder(toBuilder = true)替换为@SuperBuilder(toBuilder = true),其他注解保持不变:

@Getter
@Setter
@ToString
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@SuperBuilder(toBuilder = true)
@EqualsAndHashCode
public class A {
  private ItemInfo itemInfo;

  public boolean hasErrors() {
    return (itemInfo!= null && itemInfo.hasErrors());
  }
}

2. 修改子类B的注解

同样将子类B的@Builder(toBuilder = true)替换为@SuperBuilder(toBuilder = true):

@Getter
@Setter
@ToString
@NoArgsConstructor(access = AccessLevel.PUBLIC)
@AllArgsConstructor(access = AccessLevel.PACKAGE)
@SuperBuilder(toBuilder = true)
@EqualsAndHashCode
public class B extends A {
  private Price bestPrice;
  private Price alternativePrice;
}

3. 测试代码无需修改

原来的测试代码可以正常运行,B.builder()会自动包含父类的itemInfo设置方法:

mocked =
    B.builder()
        .itemInfo(null)
        .bestPrice(null)
        .alternativePrice(null)
        .build();

注意事项

  • 需要确保你的Lombok版本在1.18.2及以上,因为@SuperBuilder是从这个版本开始引入的。
  • 如果无法升级Lombok版本,也可以手动在子类B中扩展Builder,添加父类属性的设置方法,但这种方式代码冗余且维护成本高,不推荐。

内容的提问来源于stack exchange,提问作者runnerpaul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 19:57:14