2011-09-28 57 views
0

我有三個非常類似的類,除了一個方法。因此,我選擇將其餘的功能放到抽象的超類中。然而,當談到創建這些類的實例時,我對如何實現在我看來像「顯而易見」或「優雅」的方法感到茫然。它們的構造基本上是相同的,我需要每一個的多個實例,所以我想做一些類似如下:Java - 通常處理子類的創建

private SubclassA[] subclassA_array, SubclassB[] subclassB_array, SubclassC[] subclassC_array; 
subclassA_array = new SubclassA[getNumInstancesOfClassANeeded()] 
subclassB_array = new SubclassA[getNumInstancesOfClassBNeeded()] 
subclassC_array = new SubclassA[getNumInstancesOfClassCNeeded()] 

// might have my syntax wrong here; array of the three subclass arrays 
private Superclass[][] superArray = new Superclass[][3]; 
superArray[0] = subclassA_array; 
superArray[1] = subclassA_array; 
superArray[2] = subclassA_array; 
for (Superclass[] array: superArray) 
    for(int i = 0; i< array.length; i++) 
     // array[i] = new..... what goes here? 
    } 
} 

我將如何找到合適的類在最內部循環來構建?這實際上是一種解決問題的非常古怪的方式;我錯過了更明顯的東西嗎?我應該說「去死吧!」只有三個獨立的循環?

回答

1

如果我只是說:「管它呢!」,只是有三個獨立的循環?

IMO,是


你可以做到以下幾點:

  1. 使用array.getClass()拿到類的數組,
  2. 使用getConmponentType()得到數組的基本類型
  3. 使用newInstance()創建一個實例
  4. 指定實例參考陣列。

...但這會導致脆弱的代碼,就像使用大錘擊破核桃。

+0

你能解釋一下「脆弱」的評論嗎? – Corv

+0

它很脆弱,因爲步驟2和3涉及可能會拋出異常的反射操作。相比之下,通過簡單的方法,大多數/所有的檢查都是在編譯時進行的。編譯時間類型安全/類型檢查更健壯。 –

0

你可以在你的內循環反射,像array.getClass().getComponentType().newInstance()工作,但我覺得可能是整體的問題(要回答這個問題,我需要你想要什麼樣的代碼的詳細信息)

更好的解決方案
0

您可以創建一個靜態方法

public static subclassA[] getNewInstances(int numberOfInstances); 

靜態方法,而不需要創建一個新的實例SubclassA.getNewInstances(3)訪問。

在你的矩陣的定義,你需要首先定義第一個維度(使它成爲new Superclass[3][]

+0

我不認爲我會走這條路,但這是一個有趣的觀點。謝謝! – Corv