Java 可以从静态方法开始使用Lombok@Builder吗?
我希望Lombok能够处理我的构建器API,同时还要有一个构造函数 我从Java 可以从静态方法开始使用Lombok@Builder吗?,java,lombok,Java,Lombok,我希望Lombok能够处理我的构建器API,同时还要有一个构造函数 我从@Data类上的构造函数开始,该类与@Builder(toBuilder=true)相结合,但这让我不得不在最终字段上强制使用无效或伪值,并使用表达能力较差的fluent API。我最终用静态方法解决了我的问题,但我希望Lombok能为我的用例提供更好的解决方案 使用toBuilder的API 使用静态方法的API fooHandler.accept(tweakFoo(Foo.class, Mode.QUICK)
@Data
类上的构造函数开始,该类与@Builder(toBuilder=true)
相结合,但这让我不得不在最终字段上强制使用无效或伪值,并使用表达能力较差的fluent API。我最终用静态方法解决了我的问题,但我希望Lombok能为我的用例提供更好的解决方案
使用toBuilder的API
使用静态方法的API
fooHandler.accept(tweakFoo(Foo.class, Mode.QUICK)
.mappingOutcomeFor(FooOutcome.class)
.mappingOutcome(toEvent(BarOutcome.class))
.build()));
@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
}
}
查看第二个设置如何更好地运行
各个Lombok设置(简化)
@数据
@生成器(toBuilder=true)
公共类TweakedFoo{
私人的最后一节课;
私人最终模式;
私人期末班到;
public TweakedFoo(类源,模式){
this.from=from;
这个模式=模式;
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);
}
}
@数据
@生成器(builderMethodName=“UseTheckedFoodTockedFooinsteadPlease”)
@AllArgsConstructor(access=AccessLevel.PRIVATE)
公共类TweakedFoo{
私人的最后一节课;
私人最终模式;
私人期末班到;
公共静态TweakedFooBuilder tweakFoo(类来自,模式){
返回TweakedFoo.UseTweakedFoodTweakedFooinsteadPlease()
.从(从)
.模式(模式);
}
}
实际参数在这里没有多大意义,但是这个设置说明了我的实际用例
第二种方法不仅更加简洁,它不需要伪构造函数字段初始化,而且它隐藏了构造函数,因此除了通过构建器之外,您无法获得其他实例。然而,第二种方法需要我模糊Lombok生成的生成器启动方法,而使用我自己的静态方法
Lombok有更好的方法吗?您只需自己实现即可自定义
builder()
方法:
@Data
@Builder
public class TweakedFoo {
// ...
public static TweakedFooBuilder builder(Class<Foo> from, Mode mode) {
return new TweakedFooBuilder()
.from(from)
.mode(mode);
}
// ...
}
@数据
@建筑商
公共类TweakedFoo{
// ...
公共静态调整的FooBuilder(类来自,模式){
返回新的TweakedFooBuilder()
.从(从)
.模式(模式);
}
// ...
}
在这种情况下,Lombok不会生成另一个
builder()
方法,因为它可以识别具有相同名称的现有方法。如果您希望以不同的方式命名方法,例如tweakFoo
,请使用@Builder(builderMethodName=“tweakFoo”)
,您可以自定义Builder()
方法,只需自己实现即可:
@Data
@Builder
public class TweakedFoo {
// ...
public static TweakedFooBuilder builder(Class<Foo> from, Mode mode) {
return new TweakedFooBuilder()
.from(from)
.mode(mode);
}
// ...
}
@数据
@建筑商
公共类TweakedFoo{
// ...
公共静态调整的FooBuilder(类来自,模式){
返回新的TweakedFooBuilder()
.从(从)
.模式(模式);
}
// ...
}
在这种情况下,Lombok不会生成另一个
builder()
方法,因为它可以识别具有相同名称的现有方法。如果您希望以不同的方式命名方法,例如tweakFoo
,请使用@Builder(builderMethodName=“tweakFoo”)
为什么我没有想到这一点。谢谢我怎么没想到呢。谢谢