在从第 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.
对此有任何解决方案或替代方案吗?谢谢。
有点难看,但这是可能的。您必须在 Parent
和 SuperParent
之间的继承链中插入一个助手 class;我们称它为 SuperParentBuilderEnabler
。在此 class 中,您必须手动实施所有必要的构建器元素。特别是,您必须为 SuperParent
中的字段编写所有 setter 方法。
这将允许 Parent
和 Child
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();
}
}
我有一个 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.
对此有任何解决方案或替代方案吗?谢谢。
有点难看,但这是可能的。您必须在 Parent
和 SuperParent
之间的继承链中插入一个助手 class;我们称它为 SuperParentBuilderEnabler
。在此 class 中,您必须手动实施所有必要的构建器元素。特别是,您必须为 SuperParent
中的字段编写所有 setter 方法。
这将允许 Parent
和 Child
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();
}
}