創建類型的實例,在我的Java應用程序,我有方法如何動態Java中
public <T extends Transaction> boolean appendTransaction(T transaction) {
...
}
這個方法裏面,我需要創建對象牛逼延伸交易
的實例它是正確的做這樣
T newTransaction = (T) transaction.getClass().newInstance();
創建類型的實例,在我的Java應用程序,我有方法如何動態Java中
public <T extends Transaction> boolean appendTransaction(T transaction) {
...
}
這個方法裏面,我需要創建對象牛逼延伸交易
的實例它是正確的做這樣
T newTransaction = (T) transaction.getClass().newInstance();
更多或更少,但Class.newInstance
is evil:
請注意,此方法傳播由nullary構造函數拋出的任何異常,包括檢查的異常。使用此方法可以有效繞過編譯時異常檢查,否則編譯器會執行該異常。
改爲使用transaction.getClass().getConstructor().newInstance()
,它使用InvocationTargetException
封裝構造函數中拋出的異常。
我認爲你應該使用類型爲T的工廠接口,這樣你可以在方法用戶上強制創建實例接口。
public <T extends Transaction> boolean appendTransaction(
T transaction,
Factory<T> factory) {
...
T newTransaction = factory.createTransaction();
...
}
我在這裏同意你的意見。它絕對清潔,不那麼神奇。 – gustafc 2009-10-09 08:53:40
是更邪惡的只是getConstructor()。newInstance()的別名? – 2009-10-09 08:41:09
我更新了動機。它神奇地重新引發由默認構造函數拋出的任何異常,甚至檢查你不能明確捕獲的異常(因爲'Class.newInstance'沒有在它的簽名中聲明它們)。 – gustafc 2009-10-09 08:43:37