Lombok 的@Builder/@AllArgsConstructor 如何调用自定义构造函数?

How can Lombok's @Builder/@AllArgsConstructor invoke a custom constructor?

我有一个自定义的无参数构造函数,我希望由 Lombok 生成的生成器调用它。我认为这相当于有一个构造函数,所有参数都首先调用这样一个自定义的无参数构造函数。

我会举例说明

@Builder
@Data
public class BuilderExample extends Foo{

  private String name;
  private int age;

  public BuilderExample(){
    super.setSome(thing);
  }

}

BuilderExample.build() 创建的实例应设置 super.setSome(thing);

到目前为止,我能找到的实现此目的的唯一方法是编写全参数构造函数并使其调用无参数构造函数。我认为这打败了使用 Lombok 的构造函数和构建器的所有想法,就好像字段数高于一两个一样,all-args-constructor 的编写和维护变得乏味。

还有其他方法可以实现吗?

你可以定义一个几乎空的嵌套

class BuilderExampleBuilder {
    public BuilderExample build() {
        BuilderExample result = new ...all the stuff Lombok does
        result.setSome(thing);
        return result;
    }
}

但这有一些问题:

  • all-args-constructor 冗长且容易忘记新字段。
  • 调用result.setSome(thing)不能使用super关键字。这可以通过提供像

    这样的方法来解决

    private superSetSome(Thing thing) { super.setSome(东西); }

您还可以使用非静态初始化程序块,例如

{
   super.setSome(thing);
}

只能这样了,没有很好的解决办法。没有允许将代码注入构造函数或构建器的挂钩。