2010-02-03 34 views
4

我有一個類CommonTableModel具有幾個實例方法和對兩個實例變量分別經營對於這個問題,這將是Java中最好的設計模式嗎?

  • COLUMNNAMES
  • 數據

現在,我有六個表,每個表都有差異。列名稱,但應具有CommonTableModel類的所有實例方法。因此,要將CommonTableModel的實例傳遞給JTable實例,我應該首先初始化兩個實例變量(columnNames和data)。

Q1。我應該製作六個TableModels,每個對應於每個表,然後將它們擴展到CommonTableModel?

public class FirstTableModel extends CommonTableModel { 

    public FirstTableModel() { 
     columnNames = {"id", "name"}; 
     data = {{1, "John"}}; 
    } 
} 

在上述例子中,我試圖初始化繼承的數據成員,使得每個六個TableModel的,可根據它們表示表填充COLUMNNAMES。

但我得到一個錯誤,這限制了我以這種方式初始化繼承的成員。我認爲我們不能以這種方式初始化實例變量。

那麼我怎樣才能填充CommonTableModel的實例變量,以便CommonTableModel的實例方法處理稍後我填充它們的數據。

其中一個解決方案是在CommonTableModel的構造函數中傳遞數據,但這樣我每次在創建Table時都必須傳遞整個ColumnNames。

我很困惑,因爲我沒有太多的編程經驗,也不知道好的編碼習慣。

請參閱一些好的設計模式書籍,以便我可以更好地理解設計模式。

回答

2

但我得到一個錯誤,這限制了我以這種方式初始化繼承的成員。我認爲我們不能以這種方式初始化實例變量。其不與new初始化

數組是數組常量。申報後您只能直接初始化。例如。

String[] strings = {"foo", "bar"}; 

因此,你應該更換特定行(假定這些都已經是CommonTableModelprotected字段):

columnNames = new String[] {"id", "name"}; 
data = new Object[][] {{1, "John"}}; 

編輯按照註釋:你當然也可以定義構造函數爲此,並使用super()調用。這樣做的好處是可以提高封裝的程度,即您不需要聲明字段protected,但現在可以將其聲明爲private。這是一個開球的例子:

public abstract class CommonTableModel { 
    private String[] columnNames; 
    private Object[][] data; 

    protected CommonTableModel(String[] columnNames, Object[][] data) { 
     this.columnNames = columnNames; 
     this.data = data; 
    } 
} 

public class FirstTableModel extends CommonTableModel { 
    public FirstTableModel() { 
     super(new String[] {"id", "name"}, new Object[][] {{1, "John"}}); 
    } 
} 

請注意,您仍然需要new關鍵字來實例化它們(RSP是錯在他這裏的答案)。你應該只有不是使物業static!它會影響同類的每個實例。你真的不想那麼做。下面請看我的評論。

+0

+1」 .. 。沒有初始化的新陣列...「謝謝 – 2010-02-03 14:35:09

+0

rsp和你的答案看起來很棒。你可以請哪一個更好? – 2010-02-03 14:42:55

+0

這是你的選擇。你應該確定只是不要讓它們成爲'靜態',正如你在rsp答案的評論中提到的那樣。它會影響同一類的** ALL **實例!您還應該在通過超類的構造函數之前使用'new'關鍵字來實例化它們。我會很快用一個例子來編輯答案: – BalusC 2010-02-03 14:48:23

1

如果您的表模型之間的唯一區別是列名稱,我將它們作爲字符串數組傳遞給您的CommonTableModel的構造函數。對所有表使用相同的類,但使用不同的數據。

+0

同意 - 它看起來像他的對象之間的唯一區別是在數據中。不同的表模型應該是同一個類的獨立實例,而不是單獨的類。 – 2010-02-03 16:24:21

1

你的錶款延長公共表模式,公用表模型可以初始化在構造函數中的列和數據,我認爲你正在尋找這樣的模式:

public class CommonTableModel { 

    protected CommonTableModel (String[] n, Object[] d) { 
     columnNames = n; 
     data = d; 
    } 
} 

public class FirstTableModel extends CommonTableModel { 

    public FirstTableModel() { 

     super(new String[] {"id", "name"}, new Object[][] {{1, "John"}}); 
    } 
} 
+0

如果我在super()調用中傳遞引用變量,它會顯示編譯時錯誤爲「在超類型構造函數被調用之前無法引用n」 – 2010-02-03 14:44:39

+0

哦..我記得...我們不能將實例變量超()。我讓他們靜態,現在它工作正常。 – 2010-02-03 14:45:51

+0

如果您將它們設爲靜態,它們將具有應用程序範圍。你需要使它們成爲CommonTableModel的私有屬性,並用'new []'實例化數組。 – rsp 2010-02-03 17:13:22

相關問題