java-设计模式-静态变量继承

java-设计模式-静态变量继承,java,oop,design-patterns,Java,Oop,Design Patterns,我有一个Person类,它扩展了我的Record类,我想将数据库表名、列和列类型定义为Person类中的静态变量。我想做如下的事情,但我不能,因为我不能在不在方法中的情况下修改对象(我想这里是JavaNoob) 我不想在构造函数中定义这些,因为我希望父类(Record)中有一个静态方法,我可以执行以下操作来获取Person记录列表 List<Person> people = Person.getAll(); 但是我不能这样做,因为我的静态方法getAll()不能引用非静态方法。如何

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

我不想在构造函数中定义这些,因为我希望父类(Record)中有一个静态方法,我可以执行以下操作来获取Person记录列表

List<Person> people = Person.getAll();
但是我不能这样做,因为我的静态方法getAll()不能引用非静态方法。如何让我的静态方法getAll()知道这些静态变量存在于扩展类中并可以使用它们


我知道有一个正确的方法来做这件事,我就是想不出来

在Java中,可以在类中执行静态初始值设定项块。它们看起来像这样:

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

静态初始值设定项块在使用类之前运行一次-在程序启动和加载类之间的任何位置。

在Java中,您可以在类中执行静态初始值设定项块。它们看起来像这样:

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

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

您可以使用抽象方法执行您正在执行的操作,然后您需要做的就是将静态getAll()更改为类似getAll(Record Record)的内容,并让它调用这些方法


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

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


您的思路是正确的。我会避免依赖静态对象来处理类本身之外的任何事情,而倾向于公开实例方法,这些实例方法本身可能会调用私有或受保护的静态字段。

最好的做法是将包含所有这些对象方法和变量的实用程序类作为静态对象。Util类通常没有构造。您也可以使用静态块

  static {
   initialize your static variables here
  }

最好的做法是将包含所有这些stuff方法和变量的实用程序类设置为静态。实用程序类通常没有构造。您也可以使用静态块

  static {
   initialize your static variables here
  }

您的类记录包含
static final
变量。不需要使用getter方法来获取ststic变量的值。据我所知,您计划在getAll()方法内调用db查询。您只需使用
Classname.variable\u name

Record.dbTable;
Record.dbColumns;
Record.dbColumnTypes;

您的类记录包含
static final
变量。不需要使用getter方法来获取ststic变量的值。据我所知,您计划在getAll()方法内调用db查询。您只需使用
Classname.variable\u name

Record.dbTable;
Record.dbColumns;
Record.dbColumnTypes;

您可以考虑使用枚举。您还可以使用接口在各种基于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()< /代码>从字符串中获取枚举或从给定表获取所有列。

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

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()
从字符串中获取枚举或从给定表中获取所有列。

对不起,当它运行时是不确定的,这是什么意思?@Koray Tugay我可能在考虑C/C++等价物。@Koray Tugay我认为这更准确一点。它将在类装入器加载后的某个时间运行,但总是在类的静态方法和字段之前运行是被访问的,这是最重要的部分。对不起,你说它何时运行是不确定的是什么意思?@Koray Tugay我可能在考虑C/C++等价物。@Koray Tugay我认为这更准确一点。它将在类加载器加载它之后的某个时间运行,但总是在访问类的静态方法和字段之前运行,这是最重要的部分因此,为(new Person())执行类似于Record.getAllColumns的操作?哪种方法会创建一个空对象来获取这些静态变量?我不知道我是否误解了你的问题。getAll应该做什么?我以为它会获取你将用于查询数据库的列名。如果是这样的话,我的编辑可能会更好。但看起来你可能会使用静态getAll来查询你的database并返回一个人员列表。如果是这种情况,我会说,不要这样做。使用一个对象,它的工作是为您提供数据,而不是静态的东西来为您提供这种数据。除了将getAll更改为实例类的成员(绝对不是person的一部分!)之外,我认为该解决方案仍然是合理的。是的,getAll()的目标是就是返回一个Person对象的列表。我认为你建议使用一个单独的对象来返回这些对象是正确的做法。我只是想不出新的“RecordFinder”对象如何引用这些静态变量,而不创建一个空对象来使用它的抽象方法……使用像这样的一次性对象不是你想要的看看List的方法,toArray接受一个数组作为参数,告诉它什么类型的数组