У меня есть перечисление, которое может выглядеть так, как показано ниже. Моя цель состоит в том, чтобы иметь enum
с некоторыми распространенными методами (я применял это, добавляя абстрактный метод) и некоторые методы «enum value individual».Как вызвать Enum индивидуальные методы?
Следующий код компилирует:
public enum MyEnum {
VALUE {
@Override
public void syso() {
System.out.println("VALUE syso");
}
},
SPECIAL_VALUE {
@Override
public void syso() {
System.out.println("SPECIAL_VALUE syso");
}
public void sayHello() {
System.out.println("Hello");
}
};
public abstract void syso();
public static void main(String... args) {
MyEnum.VALUE.syso();
MyEnum.SPECIAL_VALUE.syso();
}
}
Запуск это приводит к следующему печатаемого:
VALUE syso
SPECIAL_VALUE syso
Однако пытается вызвать sayHello()
, который я определил в SPECIAL_VALUE
, не работает.
Добавление следующего к основной методе, не составляет больше:
public static void main(String... args) {
MyEnum.SPECIAL_VALUE.sayHello(); // does not work
}
Почему? Мне кажется, это прекрасно, но метод не найден. Есть ли способ вызвать этот метод? Может быть, через отражение?
Я бы хотел, чтобы этот метод не был абстрактным, потому что он не имеет смысла для любых других значений перечисления. Я также не могу extend
этот enum и добавить этот специальный метод, наследуя общие. Я также хотел бы избежать добавления какого-то одноэлементного класса для «имитации» этого.
Можно ли это запустить? Если нет, какова будет моя лучшая альтернатива?
вы обязательно сможете назвать это через отражение –
Не объявлять метод абстрактно, просто сделайте его пустым. И в 'SPECIAL_VALUE' переопределить его. Я думаю, что можно использовать рефлексию, но почему? –
@AndrewLogvinov Реализация этого пустым способом также приведет к тому, что я могу назвать 'MyEnum.VALUE.sayHello()', что ничего не сделало бы. Это не похоже на хорошую идею. – noone