Lombok @Builder继承解决方法

Viv*_*oel 17 java lombok

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

例如

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


class Bar extends Foo{

}
Run Code Online (Sandbox Code Playgroud)

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

解决方法是:

  1. 手动创建Bar的构造函数.
  2. 在构造函数上放置Builder注释.

有更好的解决方法吗?

Ana*_*ika 16

Lombok针对Builder注释面临的继承问题引入了版本:1.18.2的实验性功能,可以使用@SuperBuilder注释解决如下.

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

@SuperBuilder
public class ChildClass extends ParentClass{
    private final String c;
}
Run Code Online (Sandbox Code Playgroud)

现在,可以使用如下的Builder类(使用@Builder注释无法实现)

ChildClass.builder().a("testA").b("testB").c("testC").build();
Run Code Online (Sandbox Code Playgroud)

  • Idea 2018.1在编辑器中显示错误,但构建和运行正常. (3认同)
  • 完美的!并且适用于不止一层继承。谢谢你! (3认同)

fd8*_*8s0 10

有点隐藏,但人们之前有过这个问题,请参阅:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

可以让你使用

Child.builder().a("testA").b("testB").build()
Run Code Online (Sandbox Code Playgroud)