子类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
相关产品推荐
相关产品推荐

