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

时间:2018-08-08 16:04:08

标签: java

例如,我有:

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

(省略了默认的构造函数/ setters / getter)

我有一个A类的实例,我想创建 A(抽象字段)中B类的实例。

是的,我可以像这样使用抽象类构造函数或为类B创建构造函数:

public B(A a) {
  this.a = a.getA();
  this.b = a.getB();
  ..
  this.z = a.getZ(); 
}

但是由于我有很多领域,所以看起来并不方便 还有另一种方法吗?

1 个答案:

答案 0 :(得分:9)

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

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

}

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

  • Dozer,用于在对象之间映射数据。可以通过XML或注释完成配置。该库(AFAIK)使用反射功能,因此可能会对应用程序的性能产生直接影响。
  • Orika,它在运行时生成字节码以在对象之间映射数据。配置在设计时完成。该库(AFAIK)使用反射工作,因此它可能直接影响应用程序的性能,当我对其进行测试时,其执行时间比Dozer快(大约快7倍)。
  • MapStruct,它将生成用于映射类的代码(使用getter和setter,验证null等等),并且此代码将在运行时可用。该配置在设计时通过注释完成。该库(AFAIK)使用Java代码工作,因此类似于代码的正常执行(例如,执行b.setValue(a.getValue()))