我希望 Lombok 能够处理我的构建器 API,同时也有一个构造函数作为启动。
我开始使用 @Data
类上的构造函数与 @Builder(toBuilder = true)
相结合,但这让我不得不在最终值上强制使用无效或虚拟值字段以及表达能力较差的流畅 API。我最终使用静态方法解决了我的情况,但我希望 Lombok 对于我的用例有更好的解决方案。
使用 toBuilder 的 API
fooHandler.accept(new TweakedFoo(Foo.class, Mode.QUICK).toBuilder()
.mappingOutcomeFor(FooOutcome.class)
.mappingOutcome(toEvent(BarOutcome.class))
.build()));
使用静态方法的API
fooHandler.accept(tweakFoo(Foo.class, Mode.QUICK)
.mappingOutcomeFor(FooOutcome.class)
.mappingOutcome(toEvent(BarOutcome.class))
.build()));
看看第二个设置如何更好地进行?
各自的 Lombok 设置(简化)
@Data
@Builder(toBuilder = true)
public class TweakedFoo {
private final Class<Foo> from;
private final Mode mode;
private final Class<?> to;
public TweakedFoo(Class<Foo> from, Mode mode) {
this.from = from;
this.mode = mode;
this.to = null; // eww
}
}
还有:
@Data
@Builder(builderMethodName = "useTweakedFooDotTweakedFooInsteadPlease")
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class TweakedFoo {
private final Class<Foo> from;
private final Mode mode;
private final Class<?> to;
public static TweakedFooBuilder tweakFoo(Class<Foo> from, Mode mode) {
return TweakedFoo.useTweakedFooDotTweakedFooInsteadPlease()
.from(from)
.mode(mode);
}
}
实际参数在这里没有多大意义,但此设置说明了我的实际用例。
第二种方法不仅更简洁,而且不需要虚拟构造函数字段初始化,而且它隐藏了构造函数,因此您无法通过构建器以外的方式获取实例。然而,第二种方法要求我隐藏 Lombok 生成的构建器启动方法,以支持我自己的静态方法。
Lombok 有更好的方法吗?
最佳答案
您可以通过自己实现来自定义您的 builder()
方法:
@Data
@Builder
public class TweakedFoo {
// ...
public static TweakedFooBuilder builder(Class<Foo> from, Mode mode) {
return new TweakedFooBuilder()
.from(from)
.mode(mode);
}
// ...
}
在这种情况下,Lombok 不会生成另一个 builder()
方法,因为它会识别具有相同名称的现有方法。如果您希望该方法以不同的方式命名,例如tweakFoo
,使用@Builder(builderMethodName="tweakFoo")
。
关于java - 是否可以从静态方法开始使用 Lombok @Builder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55898381/