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

pra*_*eth 6 lombok spring-boot

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

子级 --> 父级 --> 超级父级

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

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

有什么解决方案或替代方案吗?谢谢。

Jan*_*eke 5

这有点难看,但这是可能的。您必须在Parent和之间插入一个辅助类到您的继承链中SuperParent;我们就这么称呼它吧SuperParentBuilderEnabler。在此类中,您必须手动实现所有必要的构建器元素。特别是,您必须为 中的字段编写所有 setter 方法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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在让Parent extend SuperParentBuilderEnabler你完成。

  • 嗯......如果没有其他解决方案,我想我将不得不尝试你的“丑陋”但不错的解决方案。 (2认同)