我有一个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的instace变量,以便CommonTableModel的实例方法处理稍后填充的数据。

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

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

    请也参考一些好的设计模式书,以便我对设计模式有更好的了解。

    最佳答案

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

    未使用new初始化的数组是数组常量。您只能在声明后直接对其进行初始化。例如。

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

    因此,您应该通过替换特定的行(假设这些行已经是protectedCommonTableModel字段):
    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!这将影响同一类的每个实例。您真的不想拥有它。另请在下面查看我的评论。

    10-06 14:09