首页 > 解决方案 > Class::isEnum 需要检查 this.getSuperclass() == java.lang.Enum.class;

问题描述

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

标签: java

解决方案


考虑这段代码:

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,而不是枚举类本身。

不清楚为什么需要检查修饰符位;我会说它可能比后续检查便宜,因此可以避免在常见情况下工作,但这只是引用相等,并不昂贵。也许是为了防止其他JVM语言没有执行不能Enum直接扩展的限制。


推荐阅读