为了账号安全,请及时绑定邮箱和手机立即绑定

从 obj2 转换或创建 obj1,其中 obj1 和 obj2 扩展相同的抽象类

从 obj2 转换或创建 obj1,其中 obj1 和 obj2 扩展相同的抽象类

守着星空守着你 2021-07-06 13:08:17
例如我有:public abstract class SomeAbstract {  private int a;  private int b;  ..  private int z;}public class A extends SomeAbstract {  private String aField;}public class B extends SomeAbstract {  private long bField;}(默认构造函数/setter/getter 被省略)我有一个 A 类的实例,我想从 A(抽象字段)创建一个 B 类的实例。是的,我可以像这样使用抽象类构造函数或为 B 类创建构造函数:public B(A a) {  this.a = a.getA();  this.b = a.getB();  ..  this.z = a.getZ(); }但是因为我有很多字段,这看起来不太好,也不方便还有其他方法吗?
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您可以在接收另一个超类的超类中创建一个构造函数。


public abstract class SomeAbstract {

    /* attributes... */


    public SomeAbstract() {

    }


    protected SomeAbstract(SomeAbstract another) {

        this.a = another.a;

        /* and on... */

    }


}

并在子类中重用这个构造函数:


public class B extends SomeAbstract {


    public B(A a) {

        super(a);

        this.specificAttribute = a.somethingElse;

    }


}

如果您有那么多字段并且不想/不需要手动创建整个代码,您可以使用一个外部库来帮助您进行类之间的映射。一些选项是:

  • 在对象之间映射数据的推土机。配置可以通过 XML 或注解来完成。该库使用反射工作(AFAIK),因此它可能对您的应用程序的性能产生直接影响。

  • Orika在运行时生成字节码以在对象之间映射数据。配置是在设计时完成的。该库使用反射工作(AFAIK),因此它可能对您的应用程序的性能产生直接影响,当我对其进行测试时,执行时间比 Dozer 快(大约快 7 倍)。

  • MapStruct将生成映射类的代码(使用 getter 和 setter,验证空值等),并且此代码将在运行时可用。配置是在设计时通过注解完成的。该库使用 Java 代码工作(AFAIK),因此它类似于代码的正常执行(例如 execute b.setValue(a.getValue())).


查看完整回答
反对 回复 2021-07-07
  • 1 回答
  • 0 关注
  • 130 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信