我需要将一个类的实例转换为“兄弟”类(两者都继承自同一个父类),而无需显式设置公共/父类字段。目标是使这种“映射”能够适应添加或删除字段时对父类的更改。以下是我正在使用的课程的基础知识:
家长:
@NonFinal
@SuperBuilder(toBuilder = true)
public abstract class Parent {
String parentProp;
}
孩子A:
@SuperBuilder(toBuilder = true)
public class ChildA extends Parent {
String childAProp;
}
孩子B:
@SuperBuilder(toBuilder = true)
public class ChildB extends Parent {
String childBProp;
}
给定
childA
的 ClassA
实例,我想将其转换/映射到 ClassB
,理想情况下做这样的事情:
var childB = ChildB.builder()
.parentBuilder((ParentBuilder)childA.toBuilder())
.setChildBProp("childB")
.build();
我还没有找到使用 lombok 来完成此操作的方法,但想知道我是否错过了一些明显的东西。如果 lombok 无法做到这一点,那么反射是这里的最佳选择吗?我可以访问类的源代码,因此可以修改它们,但同样,我想避免显式设置父级的属性。谢谢!
编辑:看起来这是一个类似的问题,其
Parent
类的关键不同之处不是抽象的。
您可以将这样的
parentBuilder
方法添加到父级构建器类中,然后该方法将被所有子构建器继承。父构建器有一个名为 $fillValuesFromInstanceIntoBuilder
的私有静态方法,您可以使用该方法将子类实例中的所有属性复制到 this
。
因为
$fillValuesFromInstanceIntoBuilder
采用构建对象的实例,所以 parentBuilder
只能采用 Parent
的实例,而不是构建器类型。
@SuperBuilder(toBuilder = true)
public abstract class Parent {
String parentProp;
// the name and generic parameters of this class must match the
// abstract builder class that lombok would have generated
public static abstract class ParentBuilder<C extends Parent, B extends ParentBuilder<C, B>> {
public B parentBuilder(Parent p) {
$fillValuesFromInstanceIntoBuilder(p, this);
return self();
}
}
}
我认为(我没有尝试过)这可以推广到多个继承级别。您只需要为每个具有子类的类执行类似上述操作即可。