Любой способ заставить классы иметь публичное статическое конечное поле в Java? - PullRequest
6 голосов
/ 17 марта 2010

Есть ли способ заставить классы в Java иметь публичное статическое конечное поле (через интерфейс или абстрактный класс)? Или хотя бы просто публичное поле?

Мне нужно как-то убедиться, что группа классов имеет

public static final String TYPE = "...";

в них.

Ответы [ 6 ]

7 голосов
/ 17 марта 2010

Нет, вы не можете.

Вы можете только заставить их иметь нестатический метод получения, который будет возвращать соответствующее значение для каждого подкласса:

public abstract String getType();

Если вам нужно сопоставить каждый подкласс чего-либо со значением, без необходимости создавать его экземпляр, вы можете создать где-нибудь public static Map<Class<?>, String> types;, заполнить его статически всеми классами и их типами и получить тип, вызвав TypesHolder.types.get(SomeClass.class)

5 голосов
/ 17 марта 2010

Вы можете определить интерфейс следующим образом:

interface X {
   public static final String TYPE = "...";
}

и вы можете заставить классы реализовывать этот интерфейс, который затем будет иметь это поле с тем же значением, объявленным в интерфейсе . Обратите внимание, что эта практика называется Постоянный анти-шаблон интерфейса .

Если вы хотите, чтобы у классов были разные значения , вы можете определить функцию в интерфейсе следующим образом:

interface X {
   public String getType();
}

и реализующие классы должны будут реализовать функцию, которая может возвращать различные значения при необходимости.

Примечание: это работает аналогично и с абстрактными классами.

1 голос
/ 17 марта 2010

Я не думаю, что это возможно. Но вы могли бы создать интерфейс с методом getType

1 голос
/ 17 марта 2010

Нет способа заставить компилятор принудительно применить это, но я бы хотел создать собственное FindBugs или CheckStyle правило, которое может проверить это.

0 голосов
/ 17 марта 2010

Или хотя бы просто открытое поле?

Это ИМО, обычный путь: в суперклассе требуется значение в конструкторе:

public abstract class MyAbstract {

  private final String type;

  protected MyAbstract(String type) {
    this.type = type;
  }

  public String getType() {
    return type;
  }
}

Таким образом, все реализации должны вызывать этот супер-конструктор - и им не нужно реализовывать getType () каждый.

0 голосов
/ 17 марта 2010

Реализуйте интерфейс в своих классах и вызывайте метод из этого интерфейса, как другие предложили.

Если вам абсолютно необходимо иметь статическое поле, вы можете выполнить модульный тест, который будет проходить через классы и проверять с помощью Reflection API , что у каждого класса есть это открытое статическое конечное поле. Сбой сборки, если это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...