繁体   English   中英

isEnum()匿名内部类的模糊行为

[英]isEnum() ambiguous behaviour for anonymous inner class

根据我的理解, Class.isEnum()应该对使用enum语句声明的任何枚举值返回true。

如果枚举是匿名声明的,则返回false。

isEnum()的文档说明了这一点:

“当且仅当此类在源代码中声明为枚举时才返回true。”

这对我来说似乎有点模棱两可。

我正在寻找一种区分枚举常量与其他对象的方法,所以我需要isEnum()为所有枚举常量返回true,即使它们匿名覆盖某些东西。

有没有办法识别枚举常量,除此之外?

运行该类并查看每个常量的isEnum()结果。 它将为每个常量打印出isEnum()的值。

我期待所有常量应该为isEnum()返回true。 但遗憾的是,第三个常量为isEnum()返回false。

public enum EnumTest {
Alpha(3), Beta(6), Delta(4) {
    @Override
    public int getValue() {
        return -1;
    }

    @Override
    public String toString() {
        return "Gamma";
    }
},
Epsilon(9);

private int value;

EnumTest(int value) {
    this.value = value;
}

public int getValue() {
    return this.value;
}

public static boolean isEnumWorkaround(Class enumClass) {
    while (enumClass.isAnonymousClass()) {
        enumClass = enumClass.getSuperclass();
    }
    return enumClass.isEnum();
}

public static void main(String[] args) {
    for (EnumTest thing : EnumTest.values()) {
        String nameString = thing + " (" + thing.name() + ")";
        System.out.println(String.format(
                "%-18s isEnum = %-5b [workaround isEnum = %b]", nameString, thing
                        .getClass().isEnum(), isEnumWorkaround(thing.getClass())));
    }
  }
}

如果我的理解是对的,请检查并告诉我。

如果我的理解是正确的,那么Class#isEnum()并不是为了检查一个类是否为枚举。 它只是允许你反省类声明。

正如评论中所提到的,您想要做的事情很容易实现

yourEnumValue.getClass().isAssignableFrom(Enum.class)

要么

yourEnumValue instanceof Enum

您的理解是正确的,您需要使用enumWorkaround来检查第三个值是否为枚举。 检查isEnum的代码:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/Class.java#Class.isEnum%28%29

它检查枚举位超类。 这意味着如果你有一个不直接从java.lang.Enum继承的具体类,你的enumWorkaround可能仍会失败,但我想这对枚举常量是不可能的......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM