如何在龙目岛构建器中运行构造函数之后的代码

2022-09-01 11:57:44

我有一个想要使用Lombok.Builder的类,我需要一些参数的预处理。像这样:

@Builder
public class Foo {
   public String val1;
   public int val2;
   public List<String> listValues;

   public void init(){
       // do some checks with the values.
   }
}

通常,我只会调用NoArg构造函数,但是对于生成的构建器,我无法这样做。有没有办法让生成的构建器调用它?例如,将生成如下代码:init()initbuild()

public Foo build() {
   Foo foo = Foo(params....)
   foo.init();
   return foo;
}

我知道我可以手动编写构造函数的代码,生成器将通过它调用它,我可以在里面调用。all argsinit

但这是一个次优解决方案,因为我的类可能会每隔一段时间添加一次新字段,这意味着也会更改构造函数。


答案 1

在你可以手动添加一个构造函数,让它做初始化,然后放在构造函数上。我知道你已经知道这一点,但我认为这是正确的解决方案,你不会忘记添加参数,因为你无论如何都想在构建器中使用代码。Foo@Builder

披露:我是龙目岛开发者。


答案 2

经过多次尝试和结束错误,我找到了一个合适的解决方案:扩展生成构建器并调用自己。init()

例:

@Builder(toBuilder = true, builderClassName = "FooInternalBuilder", builderMethodName = "internalBuilder")
public class Foo {

   public String val1;
   public int val2;
   @Singular public List<String> listValues;

   void init() {
      // perform values initialisation
   }

   public static Builder builder() {
      return new Builder();
   }

   public static class Builder extends FooInternalBuilder {

      Builder() {
         super();
      }

      @Override public Foo build() {
         Foo foo = super.build();
         foo.init();
         return foo;
      }
   }
}

推荐