Java 龙目定制SuperBuilder
我有两门课是这样的:Java 龙目定制SuperBuilder,java,lombok,Java,Lombok,我有两门课是这样的: @Builder public class Parent { final int a; final int b; public class static ParentBuilder { public ParentBuilder setAllTo(final int value) { return a(value).b(value); } } } public class Child e
@Builder
public class Parent {
final int a;
final int b;
public class static ParentBuilder {
public ParentBuilder setAllTo(final int value) {
return a(value).b(value);
}
}
}
public class Child extends Parent {
final in c;
@Builder(builderMethodName = "childBuilder")
public Child(final int a, final int b, final int c) {
super(a, b);
this.c = c;
}
}
我的班级在成长,得到了越来越多的领域。
这是使用@SuperBuilder
的原因。但是如何添加自定义的生成器方法呢
同样的方法也能起作用。我试着这样做:
@SuperBuilder
public abstract class Parent { //yes, I want a abstract parent
final int a;
final int b;
public class static ParentBuilder {
public ParentBuilder setAllTo(final int value) {
return a(value).b(value);
}
}
}
@SuperBuilder
public class Child extends Parent {
final in c;
}
编辑
现在还不可能。当我尝试以同样的方式执行此操作时,出现了一个例外:@SuperBuilder不支持自定义构建器。改用@Builder。
重写是如下所示的内部类:
public abstract static class ParentBuilder<C extends ParentBuilder, B extends Parent.ParentBuilder<C, B>> {
// custom imlementations here
}
public抽象静态类ParentBuilder{
//这里有定制设备
}
在1.18.2中引入@SuperBuilder
时,无法对其进行定制。如果您尝试,Lombok 1.18.2将显示错误消息SuperBuilder不支持自定义生成器。
然而,Lombok 1.18.4增加了@SuperBuilder
的有限定制可能性。(这是有限的,因为您不能修改setter方法,但可以添加自己的方法并修改build()
和builder()
)
生成的@SuperBuilder
代码非常复杂,与@Builder
不同。为了避免意外地弄乱泛型加载的构建器代码,您应该从从delombok输出复制构建器类头开始。
在您的情况下(添加新的setter方法),自定义抽象生成器类ParentBuilder
(而不是ParentBuilderImpl
)。看一看delomboked代码,了解应该如何定义setter,尤其是返回类型
这是您的示例的自定义生成器代码:
public abstract static class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
public B setAllTo(final int value) {
return a(value).b(value);
}
}
public抽象静态类ParentBuilder{
公共B设置为ALLTO(最终整数值){
返回a(值)。b(值);
}
}
在Lombok 1.18.4中,这将按照预期编译和工作。根据我的经验,不要将Lombok的生成器与父类一起使用。手动操作要好得多。实际上,这不是一门火箭科学。我最近尝试使用Lombok 1.18.8和IntelliJ定制
@SuperBuilder
,效果很好。我面临的唯一问题是,我失去了在SuperBuilder中使用toBuilder
标志的能力-@SuperBuilder(toBuilder=true)
下面是重写@SuperBuilder方法的代码
public static abstract class ChildBuilder<C extends Child, B extends ChildBuilder<C, B>>
extends ParentBuilder<C, B> {
private LocalDate date;
public B date(String dateStr) {
this.date = LocalDate.parse(dateStr);
return self();
}
}
公共静态抽象类ChildBuilder
扩展父生成器{
私有本地日期;
公共B日期(字符串dateStr){
this.date=LocalDate.parse(dateStr);
返回自我();
}
}
我在这里添加了我的工作代码:您考虑
@Builder
是对的。然而,@SuperBuilder
正是针对这个用例(类层次结构)引入的。“不要使用它”是一个答案,我不能接受。但我会记住你的意见。@JanRieke在我所有的项目中,Lombok的实验功能都是禁止的,目前的@SuperBuilder
不会生成任何代码。它认为这只是龙目岛的一个bug。你使用IntelliJ吗?IntelliJ Lombok插件尚不支持@SuperBuilder
(请参阅)。但是,它应该在Eclipse中工作,并使用Maven或Gradle。当我现在按照您的步骤操作时,我得到了一个compling异常:@SuperBuilder不支持自定义的构建器。请改用@Builder。
那么您没有使用最新的Lombok版本1.18.4。我很确定,我使用的是1.18.4。