В классе java.lang.Enum в Java есть замечательный метод getDeclaringClass. Я уже описывал перечисления в Java в соответствующей статье в учебнике. Но там я не упоминал этого метода. Дело в том, что getClass в случае с элементами перечисления, которые имеют своё тело, вернёт имя сгенерированного анонимного класса, а не того класса, который мы хотим. Метод getDeclaringClass же всегда возвращает имя класса исходного перечисления.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public class Mmmm { enum A { V1 { { System.out.println("d"); } }, V2, V3 } public static void main(String[] args) { A d = A.V1; System.out.println(d.getClass()); System.out.println(d.getDeclaringClass()); if (d.getDeclaringClass() == A.class) { System.out.println("YES"); } } } |
Выведет на консоль:
1 2 3 4 |
d class org.lsc.Mmmm$A$1 class org.lsc.Mmmm$A YES |
Как видно, getClass у d возвращает не наше перечисление A, а сгенерированный компилятором класс, что не совсем то, что обычно хотят получить. А метод getDeclaringClass возвращает как раз наше перечисление.
Как сказано в документации, два перечисления будут одного типа только тогда, когда getDeclaringClass для них возвращает одно и то же значение.