Lombok @Builder继承解决方案



Lombok @Builder不适用于继承用例:

例如

class Foo{
 protected int xyz1;
 .....
 protected String xyz7;
}

class Bar extends Foo{
}

对于给定的用例,Lombok将无法生成方法来设置Foo类中定义的参数值。

这个问题的解决方法是:

  1. 手动创建Bar的构造函数。
  2. 在构造函数上添加一个Builder注释

有更好的解决方法吗?

Lombok在版本:1.18.2中引入了实验性特性,用于解决Builder注释面临的继承问题,可以使用@SuperBuilder注释解决,如下所示。

@SuperBuilder
public class ParentClass {
    private final String a;
    private final String b;
}
@SuperBuilder
public class ChildClass extends ParentClass{
    private final String c;
}

现在,可以像下面这样使用Builder类(@Builder注释是不可能的)

ChildClass.builder().a("testA").b("testB").c("testC").build();

我把这个留在这里供参考,因为其他答案表明现在(不是在这个答案发布的时候)库中现在有一个@SuperBuilder功能,看起来更合适。

这有点隐藏,但人们以前有过这个问题,见:

https://reinhard.codes/2015/09/16/lomboks-builder-annotation-and-inheritance/

总结博客文章

@AllArgsConstructor
public class Parent {
  private String a;
}
public class Child extends Parent {
  private String b;
  @Builder
  private Child(String a, String b){
    super(a);
    this.b = b;
  }
}

将允许您使用

Child.builder().a("testA").b("testB").build()

目前有一个解决这个问题的办法。查看进度:https://github.com/rzwitserloot/lombok/pull/1337

最新更新