Java: Как обратиться к статической переменной подкласса в абстрактном классе? - PullRequest
1 голос
/ 09 марта 2019

Я понимаю, благодаря этому вопросу , что значение статического поля, объявленного в абстрактном классе, будет одинаковым для всех подклассов.

Решение в вышеупомянутом вопросе состоит в том, чтобы объявить статическое поле в каждом подклассе и абстрактный метод экземпляра "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;
  }

}

1 Ответ

0 голосов
/ 09 марта 2019

Я смог написать код таким образом, чтобы минимизировать повторение.Это также устраняет необходимость в геттере.

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);
  }

}
...