【问题标题】:Java: How to refer to subclass's static variable in abstract class?Java:如何在抽象类中引用子类的静态变量?
【发布时间】:2019-03-08 21:23:42
【问题描述】:

感谢this question,我了解到,在抽象类中声明的静态字段的值在所有子类中都是相同的。

上述问题的解决方法是在每个子类中声明一个静态字段,在抽象类中声明一个抽象的“getter”实例方法,每个子类都必须实现。

但是我的抽象类中有一个静态方法,需要引用子类的静态字段。我不能这样做,因为 getter 是一个实例方法。

这里最好的解决方案是什么?我宁愿不要在每个子类中放置几乎相同的 getAll 实例。

public abstract class AbstractModel {

  public abstract String getTableName();

  public static ResultSet getAll() {

    Statement stmt = Database.get().conn.createStatement();

    // Error below: Cannot use "this" in static context.
    String query = "SELECT * FROM `" + this.getTableName() + "`";

    return stmt.executeQuery(query);
  }

}

public class Api extends AbstractModel {

  protected static final String TABLE_NAME = "apis";

  @Override
  public String getTableName() {
    return TABLE_NAME;
  }

}

【问题讨论】:

  • 如果你想为每个子类设置不同的值,为什么首先要设置static
  • 鉴于getAll() 是静态的,它没有任何上下文。如果您编写Api.getAll(),则解析为与AbstractModel.getAll() 相同的字节码——没有在子类“上”调用静态方法的概念。也许你需要第二个类层次结构,AbstractTableApiTable 等......

标签: java static abstract-class static-methods


【解决方案1】:

我能够以这种方式编写代码,以尽量减少重复。它还消除了对 getter 的需要。

public abstract class AbstractModel {

  public static ResultSet getAllFromTable(String tableName) {

    Statement stmt = Database.get().conn.createStatement();

    String query = "SELECT * FROM `" + tableName + "`";

    return stmt.executeQuery(query);
  }

}

public class Api extends AbstractModel {

  protected static final String TABLE_NAME = "apis";

  public static ResultSet getAll() {
    return getAllFromTable(TABLE_NAME);
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2012-12-04
    • 2012-01-02
    相关资源
    最近更新 更多