繁体   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