龙目岛自定义 SuperBuilder
Lombok Customize SuperBuilder
我有两个 class 是这样的:
@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;
}
}
我的class们长大了,有了越来越多的领域。
这是使用 @SuperBuilder
的原因。但是如何添加自定义构建器方法?
Dosen 的工作方式相同。我这样试过:
@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 does not support customized builders. Use @Builder instead.
覆盖是一个内部 class 像这样:
public abstract static class ParentBuilder<C extends ParentBuilder, B extends Parent.ParentBuilder<C, B>> {
// custom imlementations here
}
在 1.18.2 中引入 @SuperBuilder
时,无法对其进行自定义。如果您尝试,Lombok 1.18.2 会给您错误消息 SuperBuilder does not support customized builders.
但是,Lombok 1.18.4 添加了 @SuperBuilder
的有限定制可能性。 (限制是因为不能修改setter方法,但是可以添加自己的方法,修改build()
和builder()
。)
生成的 @SuperBuilder
代码非常复杂,与 @Builder
不同。为避免意外弄乱 generics-loaded 构建器代码,您应该从 delombok 输出中复制构建器 class header 开始。
在您的情况下(添加新的 setter 方法),自定义抽象构建器 class ParentBuilder
(而不是 ParentBuilderImpl
)。查看 delomboked 代码,了解应该如何定义 setter,尤其是 return 类型。
这是为您的示例定制的生成器代码:
public abstract static class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
public B setAllTo(final int value) {
return a(value).b(value);
}
}
使用 Lombok 1.18.4,这可以按预期编译和工作。
我最近尝试使用 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();
}
}
我在这里添加了我的工作代码:Customize SuperBuilder in Lombok
我有两个 class 是这样的:
@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;
}
}
我的class们长大了,有了越来越多的领域。
这是使用 @SuperBuilder
的原因。但是如何添加自定义构建器方法?
Dosen 的工作方式相同。我这样试过:
@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 does not support customized builders. Use @Builder instead.
覆盖是一个内部 class 像这样:
public abstract static class ParentBuilder<C extends ParentBuilder, B extends Parent.ParentBuilder<C, B>> {
// custom imlementations here
}
在 1.18.2 中引入 @SuperBuilder
时,无法对其进行自定义。如果您尝试,Lombok 1.18.2 会给您错误消息 SuperBuilder does not support customized builders.
但是,Lombok 1.18.4 添加了 @SuperBuilder
的有限定制可能性。 (限制是因为不能修改setter方法,但是可以添加自己的方法,修改build()
和builder()
。)
生成的 @SuperBuilder
代码非常复杂,与 @Builder
不同。为避免意外弄乱 generics-loaded 构建器代码,您应该从 delombok 输出中复制构建器 class header 开始。
在您的情况下(添加新的 setter 方法),自定义抽象构建器 class ParentBuilder
(而不是 ParentBuilderImpl
)。查看 delomboked 代码,了解应该如何定义 setter,尤其是 return 类型。
这是为您的示例定制的生成器代码:
public abstract static class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
public B setAllTo(final int value) {
return a(value).b(value);
}
}
使用 Lombok 1.18.4,这可以按预期编译和工作。
我最近尝试使用 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();
}
}
我在这里添加了我的工作代码:Customize SuperBuilder in Lombok