5

我正在设计一个有两个小部件的应用程序:

- 包含任意对象的列表
- 显示当前选定对象的特定属性的表格

目标是能够从列表中选择一个对象,查看属性,并根据需要修改它们。该列表可以包含各种类型的对象。

所以说列表包含Vehicle对象和Person对象

public class Person
{
  public String     name;
  public Integer    age;
}

public class Vehicle
{
  public String    make;
  public String    model;
}

如果我单击一个Person对象,表格将显示名称和年龄,我可以为它们分配新值。同样,如果我单击一个Vehicle对象,它将在表中显示品牌和型号,并允许我对其进行修改。

我考虑过写一个类似的方法

public String[] getFields()
{
   return new String[] {"name", "age"};
}

它返回代表我要查看的实例变量的字符串列表,并使用一些反射方法来获取/设置它们。我可以在所有类中定义这个getFields方法,这样我就可以使用该表来处理可能被扔到列表中的任意对象。

但是有没有办法设计这个,这样我就不用反思了?当前的方法似乎是糟糕的设计。

另一方面,我可以TableModel为每个可能的类创建多个对象。该表将知道要显示哪些行以及如何访问对象的实例变量。但是每次添加一个新类时,我都必须定义一个新的表模型,这听起来也像是一个弱设计。

4

1 回答 1

2

您有一个类 (Vehicle),并且您知道一些属性(品牌、模型)的名称,您希望能够通过 JTable UI 为此类的实例动态操作这些属性。

您有多种不同的方法可供选择。

A. 使用反射 API

这就是反射 API 的用途。如果你想要如此动态的东西,使用反射没有错。对于此用例,性能开销不会很大。

B. 使用像beanutils这样基于反射 API的库

这应该比直接使用反射 API 更容易,但它的缺点是您需要在项目中包含另一个依赖项。

C. 在运行时动态创建不同的 TableModel 类。

您可以使用java 编译器 APIjavassist来执行此操作。根据运行时可用的信息,您可以为每种不同类型的表模型编译一个新类。如果您遵循这种方法,您必须意识到创建类是一项繁重的任务,因此第一次创建TableModel应用程序时需要一些时间来响应。

选择什么?

当然这是你的决定。对于特定的用例,反射或 beanutils 增加的开销是微不足道的,因此最好在 A 或 B 之间进行选择。在另一个性能更关键的用例中,您可以检查 C 方法,而不会忘记类创建响应时间问题。

编辑:我刚刚意识到,在这个特定的用例中,还需要另一个重要的功能。从字符串转换为每个属性的适当数据类型,反之亦然。Beanutils 对此有完美的支持,所以它在这里得到了加分。

于 2013-06-04T16:37:08.153 回答