2014-05-14 72 views
0

能否請您提供建議或提供一些提示如何做到以下幾點。 我有POJO讓我們說它被稱爲BankHistoryData。我想將兩個表中的數據複製到此POJO(主表 - 銀行及其存檔 - BankArchive)。表格有很多基本相同的字段,所以我不想重複我的自我。
我搜索了一下,發現了一個可以幫助我的工具 - Java通用構造函數。 但是,我對泛型有點新,不確定究竟該如何去做。
我想我應該有這樣的事情:如何在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

[編輯] 我已決定不使用通用對於這一點,因爲我覺得那些2美分@Alex其中對於這一點。相反,我會在業務邏輯服務層中執行此複製邏輯(POJO將保持「愚蠢」)。
雖然,我會讓這兩個hibernate對象實現通用接口(只有共享字段的getter方法在這裏)。最後,我將在我的業務邏輯服務層上創建一個複製方法,並使其將該接口參數用於複製字段。
希望這會幫助別人。此外,歡迎任何評論。
乾杯!

回答

1

你能不能創建一個超級接口,例如IBankData並讓你的BankBankArchive都實現該接口並通過接口?

如果你真的有一些特定的邏輯按銀行/ 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(); 
     } 
    } 
} 

順便說一句 - 只是我的2美分 - 在一個精心設計的結構,你通常沒有做instanceof除非在邏輯門面/調度類。

+0

我的想法。但是,我不確定Bank和BankArchive是否可以修改。 – renz

+0

我沒有提到Bank和BankArchive是Hibernate對象。所以,我不確定你打算在這個界面上放什麼東西? (getters和setters?)P.s我可以在一定程度上修改它們...... – mismas

+0

@mismas是的,任何常見的getter和setters在'Bank'和'BankArchive'之間共享。 –

1

T不能保證,因爲它被寫入,必需的字段存在。

我將其更改爲:

public class BankHistoryData<T extends MySpecificInterfaceOrSuperClass> {}