java - 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
解决方案
考虑这段代码:
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
直接扩展的限制。
推荐阅读
- ruby-on-rails - Rails Carrierwave Unpermitted 参数
- python - 如何在打开的 firefox 窗口上运行 selenium(使用 python)?(如果没有,在 Chrome 窗口上)
- uno-platform - 是什么导致 .wasm 加载图像如此缓慢?
- tensorflow - 自定义环境中的 utils.validate_py_environment 问题
- javascript - 在选择菜单中从 JSON 导入数据并在页面中更改数据
- powershell - 如何调用“Invoke-MgSubscribeGroup”?
- c - 从 c 中的无限级数计算 的值
- javascript - 为什么我在 Node 中的 MongoDBQuery 得到“未定义”结果?
- express - Graphql shield 要求在 express 服务器上启用 cors
- html - 如何格式化 HTML 表单的一部分以将部分放入列中?