2010-07-12 125 views
1

我有一個叫GetInput.java 的課,我有一個叫GetNotReleasedInput.java的課。 我在GetNotReleasedInput中擴展GetInput。 在GetInput中,我調用一個名爲addLineToArray() 的私有函數,並在該函數中定義了一個包含有關導入細節的新類。如何在Java中動態地創建對象的新實例?

但是因爲我創造了泛型類(GetInput)爲所有輸入文件, 我不能addLineToArray()說:

AAData nextData = new AAData(); 

,因爲我有AA /不釋放,在這種情況下,應該是NotReleased。 那麼我該如何動態地在該函數中創建新的nextData

回答

2

要麼創建一個受保護的方法來創建nextData對象,以便子類可以決定如何執行製造,或者您擁有某種工廠對象(可在外部對象創建時配置)。做後者最簡單的方法是通過一個Class並稱其爲newInstance()方法,但有更多的複雜性可能;一本關於軟件模式的書將會深入到這方面。

但是,如果你可以將整個東西委託給GetInput的子類,那麼這是最簡單的。 (你沒有提供足夠的信息讓我能夠計算出你應該使用哪種模式。)

+0

我像你說的那樣移動了方法,然後工作。 我也改變了原來的方法來抽象。 謝謝! – Paintrick 2010-07-12 10:13:16

0

默認情況下,Java不允許在運行時修改元數據。你可以用asm編寫自己的類加載器,並在類加載時修改字節碼,但這可能不是你想要的。我建議所有的類數據類實現Iterable或類似的東西,這樣你就可以很容易地加入,然後在不知道實際類型的情況下遍歷所有行。

1

這聽起來像你可能想要一個虛擬的factory method你可以放置你的對象創建。在addLineToArray()中,您隨後撥打 您的虛擬createLineObject()而不是new AAData()

但是,究竟要採用何種方式取決於許多因素:創建的數據類型取決於GetInput類,還是單獨的決定(您的GetInput類可能會因行爲而異,而數據可能會有所不同按格式)?是否所有數據都相關(例如繼承自AAData)?

你應該添加更多關於你想要完成的細節。