【问题标题】:Lombok Customize SuperBuilder龙目岛自定义 SuperBuilder
【发布时间】:2018-11-01 10:04:23
【问题描述】:

我有两个这样的课程:

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

【问题讨论】:

    标签: java lombok


    【解决方案1】:

    我最近尝试使用 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

    【讨论】:

    • 再添加一个方法public B date(LocalDate date),即可获得能力toBuilder回来。
    【解决方案2】:

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

    使用 Lombok 1.18.4,它可以按预期编译和工作。

    【讨论】:

    • 嗯,目前@SuperBuilder 不生成任何代码。它认为它只是龙目岛的一个错误。
    • 你使用 IntelliJ 吗? IntelliJ Lombok 插件尚不支持@SuperBuilder(请参阅github.com/mplushnikov/lombok-intellij-plugin/issues/513)。但是,它应该可以在 Eclipse 中使用 Maven 或 Gradle。
    • 是的,这就是问题所在。当我现在按照您的步骤操作时,我得到了一个例外:@SuperBuilder does not support customized builders. Use @Builder instead.
    • 那你使用的不是最新的 Lombok 版本 1.18.4。
    • 我很确定,我使用的是 1.18.4。
    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 2021-10-02
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2011-06-19
    • 2017-01-16
    相关资源
    最近更新 更多