gpt4 book ai didi

java,真实案例中的静态方法问题。表模型实现

转载 作者:行者123 更新时间:2023-11-30 07:28:31 25 4
gpt4 key购买 nike

我想实现一个 TableModel,这将使我现有的数据结构能够由 JTable 显示。
假设我的数据结构是一个简单的List ,其中 MyRow 是:

public class MyRow {
String firstName;
String secondName;
}

我的想法是这个类在显示时“应该发挥它的作用”,所以我给它添加了以下方法,它简单地将每个字段映射到一个索引:

public Object getValueAt(int columnIndex) {
switch (columnIndex) {
case 0: return firstName;
case 1: return secondName;
default: return null;
}
}

此时,TableModel 实现将只是:

public class MyModel extends AbstractTableModel {

ArrayList<MyRow> list = new ArrayList<MyRow>();

public int getRowCount() {return list.size();}
public int getColumnCount() {return 2;}
public Object getValueAt(int rowIndex, int columnIndex) {
return list.get(rowIndex).getValueAt(columnIndex);
}
}

很好,不是吗? :-)
好的,但是 return 2; 让我很烦。在这个“架构”中,我已经为 MyRow 分配了表示行的可重复性,因此应该是 MyRow 给出列数。那是因为它提供了与列数相关的 getValueAt(int columnIndex) 方法:columnsIndex 即使 List 中没有行,也可能会询问这条信息,因此没有 MyRow 的实例。所以添加到MyRow的方法应该是静态方法:

public class MyRow {
...
public static int getColumnCount() { return 2; }
...

MyModel 的 getColumnCount() 方法将做相应的简单修改:

public int getColumnCount() {
//return 2; //No more this *Encapsulation Violation*
return MyRow.getColumnCount();
}

现在 MyRow 包含表示一行所需的所有数据。很容易证明:添加、删除或更改列只是修改 MyRow 的问题。
干净,不是吗? :-) :-)

问题是使用静态方法时,我无法为 MyRow 提供抽象父类(super class)。这应该是显而易见的,但可以肯定的是:

public abstract class MyAbstractRow {
public static int getColumnCount() { return 0; }
}

然后

public class MyRow extends MyAbstractRow{
String firstName;
String secondName;
public static int getColumnCount() { return 2; }
}

然后我实现一个使用 MyAbstractRow 的“通用”MyData:

public int getColumnCount() {
//return 2; //No more this *Encapsulation Violation*
return MyAbstractRow.getColumnCount();
}

这是在静态类型上解决的(因此返回 0),因为 MyData 的 getColumnCount 甚至没有对我实际想要用作 MyAbstractRow 的具体实现的类型的引用。

如何解决这个问题,保持目前封装的良好水平?

最佳答案

您正在混合模型和 View 概念。你的模型 MyRow 不应该知道它将如何表示,所以它不应该知道有多少列,它们包含什么等等......这就是你遇到这个问题的原因(使用静态方法来知道列数).

一种更干净地执行此操作的方法是让您的 TableModel 返回列数,并通过调用 MyRow 类的成员来实现 getValueAt。您是否查看了默认实现 (DefaultTableModel)。

现在我不明白为什么你需要覆盖静态方法(这是不可能的)。如果您需要为相互继承的不同对象使用不同的表模型,那么您可以考虑创建以相同方式相互继承的不同表模型。

关于java,真实案例中的静态方法问题。表模型实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9151432/

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