我有两个这样的课程:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的课程正在成长,并获得了越来越多的领域。这是使用的共鸣@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;
}
Run Code Online (Sandbox Code Playgroud)
这还不可能。当我尝试以相同的方式进行操作时,我得到了一个例外:@SuperBuilder does not support customized builders. Use @Builder instead.
重写是一个内部类,如下所示:
public abstract static class ParentBuilder<C extends ParentBuilder, B extends Parent.ParentBuilder<C, B>> {
// custom imlementations here
}
Run Code Online (Sandbox Code Playgroud)
小智 11
我最近尝试@SuperBuilder
使用 Lombok 1.18.8 和 IntelliJ 进行自定义,效果很好。我面临的唯一问题是,我失去了toBuilder
在 SuperBuilder 中使用标志的能力 -@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();
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里添加了我的工作代码:Customize SuperBuilder in Lombok
当@SuperBuilder
在1.18.2介绍,自定义这是不可能的。如果您尝试,Lombok 1.18.2 会为您提供错误消息SuperBuilder does not support customized builders.
但是,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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用 Lombok 1.18.4,这可以编译并按预期工作。