Class :: isEnum необходимо проверить this.getSuperclass () == java .lang.Enum.class; - PullRequest
2 голосов
/ 08 мая 2020
public boolean isEnum() {
    // An enum must both directly extend java.lang.Enum and have
    // the ENUM bit set; classes for specialized enum constants
    // don't do the former.
    return (this.getModifiers() & ENUM) != 0 &&
        this.getSuperclass() == java.lang.Enum.class;
}

Зачем нужна следующая проверка?

 this.getSuperclass() == java.lang.Enum.class

Этой следующей проверки недостаточно?

(this.getModifiers() & ENUM) != 0

1 Ответ

2 голосов
/ 08 мая 2020

Рассмотрим этот код:

enum Foo { A{}, B }

public static void main (String[] args) throws java.lang.Exception
{
    System.out.println(Foo.A.getClass().isEnum());
    System.out.println(Foo.B.getClass().isEnum());
}

Это напечатает :

false
true

Класс Foo.A не считается перечислением; класс Foo.B равен.

Это потому, что Foo.A на самом деле является экземпляром подкласса Foo, а не сам класс enum.

Непонятно, почему проверка на бите модификатора необходимо; Я бы сказал, что это может быть дешевле, чем последующая проверка, и, таким образом, избежать работы в общем случае, но это просто эталонное равенство, что не дорого. Возможно, это сделано для защиты от других языков JVM, не применяющих ограничение о невозможности расширения Enum напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...