我有一个 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。
我很困惑,因为我在编程方面没有太多经验,也不了解良好的编码习惯。
请参考一些好的设计模式书籍,以便我能更好地理解设计模式。
答案 0 :(得分:2)
但是我收到一个错误,限制我以这种方式初始化继承的成员。我认为我们不能以这种方式初始化实例变量。
未使用new
初始化的数组是数组常量。您只能在声明后直接初始化 。 E.g。
String[] strings = {"foo", "bar"};
因此,您应该替换特定的行(假设protected
已经是CommonTableModel
个字段):
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
!!它会影响同一类的每个实例。你真的不想拥有它。另见下文我的评论。
答案 1 :(得分:1)
如果表模型之间的唯一区别是列名,我只是将它们作为字符串数组传递给CommonTableModel的构造函数。对所有表使用相同的类,但使用不同的数据。
答案 2 :(得分: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"}});
}
}