如何在java中执行泛型复制构造函数

时间:2014-05-14 09:32:45

标签: java

您能告诉或提供一些提示如何做以下事项。 我有POJO让我们说它叫做BankHistoryData。我想将两个表中的数据复制到此POJO(主表 - 银行及其存档 - BankArchive)。表格有很多基本相同的字段,所以我不想重复自己 我用Google搜索并找到了一个可以帮助我解决这个问题的工具 - Java通用构造函数。 但是,我对仿制药有点新意,不确定如何做到这一点 我想我应该有这样的事情:

public class BankHistoryData<T extends Serializable> {
    // I would like to set this fields from the object T
    private field1;
    private field2;
    // and many more ...

    T a; // source object from which to copy values
    public BankHistoryData(T a) { 
       this.a = a; 
       copyData();
    } 

    // NOT SURE ABOUT THIS ... something like this
    public void copyData() {
      if(T instanceof Bank) { 
        this.field1 = ((Bank)a).getSomeField();
        // and so on ...
      } else if (T instanceof BankArchive) {
         this.field1 = ((BankArchive)a).getSomeField();
         // and so on ...
      } else {
         trow new IllegalArgumentException("Not supported table");
      }
    }
}

欢迎任何建议。谢谢!

mismas

[编辑] 我决定不使用泛型,因为我认为来自@Alex的2美分就是为了那个。相反,我将在我的业务逻辑服务层中执行此复制逻辑(POJO将保持&#34;愚蠢&#34;)。 虽然,我将使这两个hibernate对象实现通用接口(只有共享字段的getter方法将在这里)。最后,我将在我的业务逻辑服务层上创建一个复制方法,并使其采用该接口参数来复制字段 希望这会对某人有所帮助。此外,欢迎任何评论 干杯!

2 个答案:

答案 0 :(得分:1)

T不能保证,正如所写,必须存在必填字段。

我会将其更改为:

public class BankHistoryData<T extends MySpecificInterfaceOrSuperClass> {}

答案 1 :(得分:1)

你能创建一个超级界面,例如IBankData并让您的BankBankArchive都实现该界面并传入界面?

如果您确实拥有Bank / BankArchive的某些特定逻辑,则可以执行

public class MyClass<T extends IBankData> {

    public void copyData(T instance) {
        T.getFieldXXX() // this would work because T extends IBankData

        if (T instanceof Bank) {
            ((Bank) T).getBankSpecificField();
        }
    }
}
BTW - 只需2美分 - 在设计良好的结构中,除非在逻辑外观/调度课程中,否则通常不需要instanceof