0

我有一个 Person 类,它扩展了我的 Record 类,我想将数据库表名、列和列类型定义为 Person 类中的静态变量。我想做类似以下的事情,但我做不到,因为我不能在不在方法中时修改对象(我认为?这里是 java noob)。

class Person extends Record{
    protected static final String dbTable = "people";
    protected static LinkedHashMap<String, String> dbColumns = new LinkedHashMap<String, String>();
    dbColumns.put("id","integer");
    dbColumns.put("name", "text");
}

我可以执行以下操作,但它看起来很乱而且可读性不强,特别是如果我的表有几列

class Person extends Record{
    protected static final String dbTable = "people";
    protected static final String[] dbColumns= {"id","name"};
    protected static final String[] dbColumnTypes= {"integer","text"};

}

我不想在构造函数中定义这些,因为我想要父类(记录)中的静态方法,我可以执行以下操作来获取人员记录列表

List<Person> people = Person.getAll();

我最初的想法是在我的 Record 类中创建以下抽象方法,并且它们在 Person 类中的实现将返回适当的静态变量。

public abstract String getTableName();
public abstract String[] getColumnNames();
public abstract String[] getColumnTypes();

但我不能这样做,因为我的静态方法 getAll() 不能引用非静态方法。我如何让我的静态方法 getAll() 知道这些静态变量存在于扩展类中并且可以使用它们?

我知道有一个正确的方法可以做到这一点,我只是想不通。

4

5 回答 5

1

在 Java 中,您可以在类中执行静态初始化程序块。它们看起来像这样:

static
{
    dbColumns.put("id","integer");
    dbColumns.put("name", "text");
}

静态初始化程序块在使用类之前运行一次 - 在程序启动和加载类之间的任何地方。

于 2013-04-18T04:59:52.897 回答
1

你可以用抽象方法做你正在做的事情,然后你需要做的就是将你的静态 getAll() 更改为类似于 getAll(Record record) 并让它调用这些方法。

你在正确的轨道上。我会避免依赖于类本身之外的任何东西的静态事物,而是个人公开可能调用私有或受保护静态字段的实例方法。

于 2013-04-18T05:03:10.273 回答
1

您可以考虑使用枚举。您还可以使用接口在各种基于 Db 的类之间提供抽象。

interface DbColumn{
  String getName();
  String getType();
}

enum PersonDbColumns implements DbColumn {
  ID("integer"),
  NAME("text");

  PersonDbColumns(String type) {
    this.type=type;
  }

  private String type;

  String getName() {
    return this.toString();
  }

  String getType() {
    return type;
  } 

}

您可以向每列添加更多字段。如果您不填充枚举的所有元素,您将获得编译时错误的优势,前提是您使用构造函数进行初始化。您必须从字符串valuOf()Class.getEnumConstants()获取枚举或从给定表中获取所有列。

于 2013-04-18T05:25:25.263 回答
0

最好的做法是让 Utility 类包含所有这些东西方法和变量作为静态变量。Utility 类通常没有构造。你也可以使用静态块

  static {
   initialize your static variables here
  }
于 2013-04-18T05:19:41.187 回答
0

您的类 Record 包含static final变量。无需使用 getter 方法来获取 ststic 变量的值。据我了解,您计划在 getAll() 方法中调用数据库查询。你应该简单地使用访问静态变量Classname.variable_name

Record.dbTable;
Record.dbColumns;
Record.dbColumnTypes;
于 2013-04-18T05:21:54.983 回答