为了账号安全,请及时绑定邮箱和手机立即绑定

Lombok 自定义 SuperBuilder

Lombok 自定义 SuperBuilder

收到一只叮咚 2021-12-22 19:07:07
我有两个这样的课程:@Builderpublic 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 工作。我试过这种方式:@SuperBuilderpublic 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);        }    }}@SuperBuilderpublic 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}
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

我最近尝试@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();

    }

}


查看完整回答
反对 回复 2021-12-22
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 397 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信