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

例如我有:


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

}

但是因为我有很多字段,这看起来不太好,也不方便还有其他方法吗?


守着星空守着你
浏览 131回答 1
1回答

喵喵时光机

您可以在接收另一个超类的超类中创建一个构造函数。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())).
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java