龙目岛自定义SuperBuilder

use*_*157 6 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 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

  • 添加另一个方法“public B date(LocalDate date)”,您可以重新获得“toBuilder”的能力。 (2认同)

Jan*_*eke 5

@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,这可以编译并按预期工作。