Lombok 自定义 SuperBuilder

我有两个这样的课程:


@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. 但是如何添加自定义构建器方法?


同样的方式 dosent 工作。我试过这种方式:


@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

}


收到一只叮咚
浏览 398回答 2
2回答

胡说叔叔

我最近尝试@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>>&nbsp; &nbsp; &nbsp; &nbsp; extends ParentBuilder<C, B> {&nbsp; &nbsp; private LocalDate date;&nbsp; &nbsp; public B date(String dateStr) {&nbsp; &nbsp; &nbsp; &nbsp; this.date = LocalDate.parse(dateStr);&nbsp; &nbsp; &nbsp; &nbsp; return self();&nbsp; &nbsp; }}

斯蒂芬大帝

当@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>> {&nbsp; &nbsp; public B setAllTo(final int value) {&nbsp; &nbsp; &nbsp; &nbsp;return a(value).b(value);&nbsp; &nbsp; }}使用 Lombok 1.18.4,它可以编译并按预期工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java