如何在Lombok构建器中的构造函数之后运行代码
我有一个类,我想使用Lombok.Builder,我需要预处理一些参数。 像这样的东西:
@Builder public class Foo { public String val1; public int val2; public List listValues; public void init(){ // do some checks with the values. } }
通常我会在NoArg构造函数上调用init()
,但是使用生成的构建器我无法这样做。 有没有办法让生成的构建器调用此init
? 例如, build()
将生成如下代码:
public Foo build() { Foo foo = Foo(params....) foo.init(); return foo; }
我知道我可以手动编写all args
构造函数,Builder将通过它调用它,我可以在那里调用init
。
但这是次优解决方案,因为我的类可能偶尔会添加新字段,这也意味着更改构造函数。
经过多次试验和结束错误后,我找到了一个合适的解决方案:扩展生成构建器并自己调用init()
。
例:
@Builder(toBuilder = true, builderClassName = "FooInternalBuilder", builderMethodName = "internalBuilder") public class Foo { public String val1; public int val2; @Singular public List 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; } } }
在Foo
你可以手动添加一个构造函数, @Builder
进行初始化,并在构造函数上放置@Builder
。 我知道您已经知道这一点,但我认为这是正确的解决方案,您不会忘记添加参数,因为您确实想要使用构建器中的代码。
披露:我是一名lombok开发者。
我偶然发现了同样的问题。 但另外,我想在构建器中添加一个方法buildOptional()
以便在每次需要时不重复Optional.of(Foo)
。 这不适用于之前发布的方法,因为链式方法返回FooInternalBuilder
对象; 并将buildOptional()
放入FooInternalBuilder
会错过Builder
的init()
方法执行…
另外,我个人不喜欢2个构建器类的存在。
这是我做的事情:
@Builder(buildMethodName = "buildInternal") @ToString public class Foo { public String val1; public int val2; @Singular public List listValues; public void init(){ // do some checks with the values. } /** Add some functionality to the generated builder class */ public static class FooBuilder { public Optional buildOptional() { return Optional.of(this.build()); } public Foo build() { Foo foo = this.buildInternal(); foo.init(); return foo; } } }
您可以使用以下主方法进行快速测试:
public static void main(String[] args) { Foo foo = Foo.builder().val1("String").val2(14) .listValue("1").listValue("2").build(); System.out.println(foo); Optional fooOpt = Foo.builder().val1("String").val2(14) .listValue("1").listValue("2").buildOptional(); System.out.println(fooOpt); }
这样做让我们添加我想要的东西:
- 添加一个
init()
方法,该方法在每个对象构造后自动执行 - 添加新字段不需要额外的工作(因为它将用于单独编写的构造函数)
- 可以添加其他function(包括
init()
执行) - 保留
@Builder
注释带来的完整标准function - 不要公开其他构建器类
即使你在我想分享这个解决方案之前解决了你的问题。 它有点短,并添加了(对我而言)不错的function。