[英]Which would be the best design pattern in Java for this problem?
我有一個CommonTableModel類,它有幾個實例方法,每個方法都對兩個實例變量進行操作
現在,我有六個表,每個表都有差異。 列名,但應具有CommonTableModel類的所有實例方法。 因此,要將CommonTableModel的實例傳遞給JTable實例,我應該首先初始化兩個實例變量(columnNames和data)。
Q1。 我應該制作六個TableModel,每個TableModel對應於每個表,然后將它們擴展到CommonTableModel嗎?
public class FirstTableModel extends CommonTableModel {
public FirstTableModel() {
columnNames = {"id", "name"};
data = {{1, "John"}};
}
}
在上面的示例中,我嘗試初始化繼承的數據成員,以便六個TableModel中的每一個都可以根據它們表示的表填充columnNames。
但我收到一個錯誤,限制我以這種方式初始化繼承的成員。 我認為我們不能以這種方式初始化實例變量。
然后,我如何填充CommonTableModel的instace變量,以便CommonTableModel的實例方法處理我稍后填充它們的數據。
其中一個解決方案是在CommonTableModel的構造函數中傳遞數據,但是這樣,每次制作表時我都必須傳遞整個columnNames。
我很困惑,因為我沒有太多的編程經驗,也不知道好的編碼實踐。
請參考一些優秀的設計模式書籍,以便我能更好地理解設計模式。
但我收到一個錯誤,限制我以這種方式初始化繼承的成員。 我認為我們不能以這種方式初始化實例變量。
未使用new
初始化的數組是數組常量 。 您只能在聲明后直接初始化它們。 例如
String[] strings = {"foo", "bar"};
因此,您應該替換特定的行(假設它們已經是CommonTableModel
protected
字段):
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
! 它會影響同一個類的每個實例 。 你真的不想擁有它。 另見下面的評論。
如果表模型之間的唯一區別是列名,我只是將它們作為字符串數組傳遞給CommonTableModel的構造函數。 對所有表使用相同的類,但使用不同的數據。
您的表模型擴展了公共表模型,公共表模型可以在其構造函數中初始化列和數據,我認為您正在尋找這樣的模式:
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"}});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.