Какой-либо способ вынудить классы иметь общедоступное статическое заключительное поле в Java?

Существует ли способ вынудить классы в Java иметь общедоступное статическое заключительное поле (через интерфейсный или абстрактный класс)? Или по крайней мере просто общедоступное поле?

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

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

в них.

6
задан serg 17 March 2010 в 16:41
поделиться

6 ответов

Нет, нельзя.

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

public abstract String getType();

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

7
ответ дан 8 December 2019 в 17:20
поделиться

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

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

0
ответ дан 8 December 2019 в 17:20
поделиться

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

1
ответ дан 8 December 2019 в 17:20
поделиться

Или, по крайней мере, просто публичное поле?

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

public abstract class MyAbstract {

  private final String type;

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

  public String getType() {
    return type;
  }
}

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

0
ответ дан 8 December 2019 в 17:20
поделиться

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

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

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

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

interface X {
   public String getType();
}

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

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

5
ответ дан 8 December 2019 в 17:20
поделиться

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

1
ответ дан 8 December 2019 в 17:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: