Lombok @SuperBuilder - 将对象从一个子类转换为另一个子类,保留父类的字段

问题描述 投票:0回答:1

我需要将一个类的实例转换为“兄弟”类(两者都继承自同一个父类),而无需显式设置公共/父类字段。目标是使这种“映射”能够适应添加或删除字段时对父类的更改。以下是我正在使用的课程的基础知识:

家长:

@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
类的关键不同之处不是抽象的。

java reflection lombok builder
1个回答
0
投票

您可以将这样的

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();
        }
    }
}

我认为(我没有尝试过)这可以推广到多个继承级别。您只需要为每个具有子类的类执行类似上述操作即可。

© www.soinside.com 2019 - 2024. All rights reserved.