簡體   English   中英

對於這個問題,哪個是Java中最好的設計模式?

[英]Which would be the best design pattern in Java for this problem?

我有一個CommonTableModel類,它有幾個實例方法,每個方法都對兩個實例變量進行操作

  • COLUMNNAMES
  • 數據

現在,我有六個表,每個表都有差異。 列名,但應具有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM