Это совсем не удивительно.
Когда вы определяете тип enum
(в вашем случае Enum1
) и объявляете значения для него, их ссылочный тип будет иметь определенный тип (Enum1
).Когда вы определяете методы в своих enum
объявлениях, вы только что создали анонимные подклассы .
public enum Enum1 {
OVERWHELMING(16) {
public String getName() {
return "OVERWHELMING";
}
};
// And the remaining constructors, fields and methods
}
И вы не можете просто обычно вызывать методыанонимный класс вне самого определения.Аналогичным образом, someOtherMethod()
также не будет доступен извне:
ActionListener al = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
someOtherMethod();
}
public void someOtherMethod() {
System.out.println("Some other method!");
}
};
Однако такие методы доступны из самой декларации, например, , указанный в этом ответе .
Примечание: Как и Йоахим Зауэр сказал в своем комментарии , это может быть не самый лучший дизайн.Вы должны, например, переместить ваши методы к типу Enum1
.
Существует еще способ.Доступ к методу можно получить с помощью отражения:
Class<?> clazz = Enum1.HUGE.getClass();
Method method = clazz.getMethod("getCountry");
System.out.println(method.invoke(Enum1.HUGE)); // Prints "India"