龙目岛自定义 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