2009-10-09 37 views
2

創建類型的實例,在我的Java應用程序,我有方法如何動態Java中

public <T extends Transaction> boolean appendTransaction(T transaction) { 
    ... 
} 

這個方法裏面,我需要創建對象牛逼延伸交易

的實例

它是正確的做這樣

T newTransaction = (T) transaction.getClass().newInstance(); 

回答

2

更多或更少,但Class.newInstance is evil:

請注意,此方法傳播由nullary構造函數拋出的任何異常,包括檢查的異常。使用此方法可以有效繞過編譯時異常檢查,否則編譯器會執行該異常。

改爲使用transaction.getClass().getConstructor().newInstance(),它使用InvocationTargetException封裝構造函數中拋出的異常。

+0

是更邪惡的只是getConstructor()。newInstance()的別名? – 2009-10-09 08:41:09

+0

我更新了動機。它神奇地重新引發由默認構造函數拋出的任何異常,甚至檢查你不能明確捕獲的異常(因爲'Class.newInstance'沒有在它的簽名中聲明它們)。 – gustafc 2009-10-09 08:43:37

5

我認爲你應該使用類型爲T的工廠接口,這樣你可以在方法用戶上強制創建實例接口。

public <T extends Transaction> boolean appendTransaction(
     T transaction, 
     Factory<T> factory) { 
    ... 
    T newTransaction = factory.createTransaction(); 
    ... 
} 
+0

我在這裏同意你的意見。它絕對清潔,不那麼神奇。 – gustafc 2009-10-09 08:53:40