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。