【问题标题】:Using Lombok's @SuperBuilder concept on a class extended from a 3rd party library在从 3rd 方库扩展的类上使用 Lombok 的 @SuperBuilder 概念
【发布时间】:2020-08-25 18:10:43
【问题描述】:

我有一个如下的类层次结构。

孩子 --> 父母 --> 超级父母

由于 Child 类扩展了 Parent 类,我必须使用 Lombok 的 @SuperBuilder 注释而不是 @Builder。另外,据我所知,所有超类都需要有@SuperBuilder 注释。但就我而言, SuperParent 类来自外部库,我无法在其中添加 @SuperBuilder 注释。我收到以下编译错误。

The constructor SuperParent(DocumentUploadedResponseDto.DocumentUploadedResponseDtoBuilder<capture#1-of ?,capture#2-of ?>) is undefined.

对此有任何解决方案或替代方案吗?谢谢。

【问题讨论】:

  • 要求所有超类也有@SuperBuilder注解

标签: spring-boot lombok


【解决方案1】:

这有点难看,但这是可能的。您必须在ParentSuperParent 之间的继承链中插入一个辅助类;我们称之为SuperParentBuilderEnabler。在此类中,您必须手动实现所有必要的构建器元素。特别是,您必须为SuperParent 中的字段编写所有设置方法。 这将允许 ParentChild 类简单地使用 @SuperBuilder 注释而无需任何进一步的修改。

我假设SuperParent 有一个int superParentField 字段,只是为了演示如何在构建器类中编写这样的setter 方法。此外,我假设该字段可以通过构造函数参数设置。这是你必须做的:

public abstract class SuperParentBuilderEnabler extends SuperParent {
    public static abstract class SuperParentBuilderEnablerBuilder<C extends SuperParentBuilderEnabler, B extends SuperParentBuilderEnablerBuilder<C, B>> {
        private int superParentField;

        public B superParentField(int superParentField) {
            this.superParentField = superParentField;
            return self();
        }

        protected abstract B self();

        public abstract C build();
    }

    protected SuperParentBuilderEnabler(SuperParentBuilderEnablerBuilder<?, ?> b) {
        super(b.superParentField);
    }
}

现在让Parent extend SuperParentBuilderEnabler 完成。

【讨论】:

  • hmmm...如果没有其他解决方案,我想我将不得不尝试您的“丑陋”但不错的解决方案。
  • 今天我实施了您的解决方案。这是完美的工作。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-06-09
  • 2019-09-14
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2020-07-18
  • 2015-08-10
  • 1970-01-01
相关资源
最近更新 更多