gpt4 book ai didi

java - 对于这个问题,哪个是 Java 中最好的设计模式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:10 25 4
gpt4 key购买 nike

我有一个 CommonTableModel 类,它有几个实例方法,每个方法都对两个实例变量进行操作

  • 列名
  • 数据

现在,我有六个表,每个表都有差异。列名称,但应具有 CommonTableModel 类的所有实例方法。因此,要将 CommonTableModel 的实例传递给 JTable 实例,我应该首先初始化两个实例变量(columnNames 和 data)。

Q1。我是否应该创建六个 TableModel,每个对应一个表,然后将它们扩展到 CommonTableModel?

public class FirstTableModel extends CommonTableModel {

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

在上面的示例中,我尝试初始化继承的数据成员,以便六个 TableModel 中的每一个都可以根据它们表示的表填充 columnNames。

但是我遇到了一个错误,它限制我以这种方式初始化继承的成员。我认为我们不能以这种方式初始化实例变量。

那么我如何填充 CommonTableModel 的实例变量,以便 CommonTableModel 的实例方法处理我稍后填充它们的数据。

解决方案之一是在 CommonTableModel 的构造函数中传递数据,但那样的话,每次创建表时我都必须传递整个 columnNames。

我很困惑,因为我没有太多编程经验,也不知道良好的编码习惯。

也请引用一些好的设计模式书籍,让我对设计模式有更好的理解。

最佳答案

But I got an error which is restricting me to initialize the inherited members in this way. I think that we can't initialize instance variables in this way.

未使用 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 在他的回答中是错误的)。您只应使属性静态!!它会影响同一类的每个实例。你真的不想拥有那个。另请参阅下面我的评论。

关于java - 对于这个问题,哪个是 Java 中最好的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2192471/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com