我希望龙目岛(Lombok)照顾我的生成器API,同时还要有一个构造函数作为开始。
我从@Data
类上的构造函数与@Builder(toBuilder = true)
组合开始,但这使我不得不在最终字段上强制使用无效或伪值,以及表达能力较差的API。我终于使用静态方法解决了我的情况,但是我希望Lombok对于我的用例有更好的解决方案。
使用 toBuilder
的APIfooHandler.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生成的构建器启动方法,而倾向于使用我自己的静态方法。
龙目岛有更好的方法吗?
答案 0 :(得分:1)
您可以通过简单地自己实施来自定义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")
。