Существует ли способ вынудить классы в Java иметь общедоступное статическое заключительное поле (через интерфейсный или абстрактный класс)? Или по крайней мере просто общедоступное поле?
Я должен удостовериться так или иначе, что группа классов имеет
public static final String TYPE = "...";
в них.
Нет, нельзя.
Вы можете только заставить их иметь нестатический метод получения, который будет возвращать соответствующее значение для каждого подкласса:
public abstract String getType();
Если вам нужно сопоставить каждый подкласс чего-либо со значением без необходимости создавать его экземпляр, вы можете создать общедоступные статические типы Map
где-нибудь, статически заполнить его всеми классами и их типами и получить тип, вызвав TypesHolder.types.get (SomeClass.class)
Реализуйте интерфейс в своих классах и вызовите метод из этого интерфейса, как предлагали другие .
Если вам абсолютно необходимо статическое поле, вы можете сделать модульный тест, который будет проходить через классы и проверять с помощью Reflection API , что каждый класс имеет это общедоступное статическое конечное поле. Если это не так, завершите сборку неудачно.
Компилятор не может принудительно применить это, но я хотел бы создать собственный FindBugs или CheckStyle ] правило, которое может проверить это.
Или, по крайней мере, просто публичное поле?
Это обычный способ ИМО: в суперклассе требуется значение в конструкторе:
public abstract class MyAbstract {
private final String type;
protected MyAbstract(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
Таким образом, все реализации должны вызывать этот суперконструктор - и они не обязательно реализовывать getType () каждый.
Вы можете определить интерфейс следующим образом:
interface X {
public static final String TYPE = "...";
}
и сделать классы, реализующие этот интерфейс, которые будут иметь поле с тем же значением, которое объявлено в интерфейсе. Обратите внимание, что такая практика называется антипаттерном постоянного интерфейса.
Если вы хотите, чтобы классы имели разные значения, то вы можете определить функцию в интерфейсе, например, так:
interface X {
public String getType();
}
и реализующие классы должны будут реализовать эту функцию, которая может возвращать разные значения по мере необходимости.
Примечание: Это работает аналогично и с абстрактными классами.
Я не думаю, что это возможно. Но можно сделать интерфейс с методом getType