子类继承含@Builder注解的不可修改父类,实现Builder模式报错求助
解决子类继承带@Builder的第三方父类时的Builder模式实现问题
当父类来自依赖包且标注了@Builder(无法修改),直接在子类使用@Builder或@SuperBuilder会报错——这是因为Lombok的@Builder原生不支持继承,而@SuperBuilder要求父类也必须使用@SuperBuilder注解,两者元数据不兼容。
下面是两种可行的解决方案:
方案一:手动编写子类Builder(推荐)
复用父类自动生成的Builder,扩展子类属性的构建逻辑,示例如下:
第三方父类(不可修改)
import lombok.Builder; import lombok.Getter; @Getter @Builder public class Parent { private final String parentField; }
子类实现自定义Builder
import lombok.Getter; @Getter public class Child extends Parent { private final String childField; // 通过父类实例初始化子类 private Child(Parent parent, String childField) { super(parent.getParentField()); this.childField = childField; } // 对外暴露Builder入口 public static ChildBuilder builder() { return new ChildBuilder(); } // 子类Builder继承父类Builder public static class ChildBuilder extends Parent.ParentBuilder<ChildBuilder> { private String childField; // 添加子类属性的设置方法 public ChildBuilder childField(String childField) { this.childField = childField; return this; } // 重写build方法,先构建父类实例,再创建子类实例 @Override public Child build() { Parent parent = super.build(); return new Child(parent, childField); } } }
使用方式和普通Builder一致:
Child child = Child.builder() .parentField("父类属性") .childField("子类属性") .build();
方案二:借助Lombok的静态工厂方法+@Builder
如果父类构造器为公开(部分场景下@Builder生成的构造器可能为公开),可以直接通过静态工厂方法配合@Builder绕开继承冲突:
import lombok.Builder; import lombok.Getter; @Getter public class Child extends Parent { private final String childField; // 公开构造器,供静态工厂方法调用 private Child(String parentField, String childField) { super(parentField); this.childField = childField; } @Builder public static Child of(String parentField, String childField) { return new Child(parentField, childField); } }
这种方式需要手动映射父类和子类的所有属性,适合属性较少的场景。
内容的提问来源于stack exchange,提问作者Sara Selim
相关产品推荐
相关产品推荐

