龙目岛自定义超级建筑

2022-09-04 08:42:36

我有两个这样的类:

@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 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
}

答案 1

我最近尝试使用龙目岛1.18.8和IntelliJ进行自定义,并且工作正常。我面临的唯一问题是,我失去了在SuperBuilder中使用标志的能力 - 。@SuperBuildertoBuilder@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();
    }
}

我在这里添加了我的工作代码:在龙目岛自定义超级建筑


答案 2

在 1.18.2 中引入时,无法对其进行自定义。如果您尝试,龙目岛1.18.2会给您错误消息@SuperBuilderSuperBuilder does not support customized builders.

但是,龙目岛 1.18.4 添加了有限的自定义可能性。(这是有限的,因为您无法修改 setter 方法,但您可以添加自己的方法并修改 和 。)@SuperBuilderbuild()builder()

生成的代码非常复杂,与 不同。为了避免意外搞乱泛型加载的生成器代码,您应该从 delombok 输出复制生成器类标头开始。在您的情况下(添加新的 setter 方法),请自定义抽象生成器类(而不是 )。查看 delomboked 代码,了解应如何定义 setter,尤其是返回类型。@SuperBuilder@BuilderParentBuilderParentBuilderImpl

这是您的示例的自定义构建器代码:

public abstract static class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
    public B setAllTo(final int value) {
       return a(value).b(value);
    }
}

在龙目岛1.18.4中,这可以按预期编译和工作。


推荐