在从第 3 方库扩展的 class 上使用 Lombok 的 @SuperBuilder 概念

Using Lombok's @SuperBuilder concept on a class extended from a 3rd party library

我有一个 class 层次结构,如下所示。

Child --> Parent --> 超级Parent

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

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

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

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

我假设 SuperParent 有一个 int superParentField 字段,只是为了演示如何在构建器 class 中编写这样的 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 完成。

我正在分享我如何应用已接受的答案 RepresentationModel

abstract class BaseTypeParent<T extends BaseTypeParent<T>>
        extends RepresentationModel<T> {

    protected abstract static class BaseTypeParentBuilder<
            T extends BaseTypeParent<T>,
            C extends BaseTypeParent<T>,
            B extends BaseTypeParentBuilder<T, C, B>
            > {

        protected abstract B self();

        public abstract C build();
    }

    protected BaseTypeParent(final BaseTypeParentBuilder<T, ?, ?> b) {
        super();
    }
}