【问题标题】:Java Enums: List enumerated values from a Class<? extends Enum>Java 枚举:列出 Class<? 中的枚举值扩展枚举>
【发布时间】:2010-12-10 06:13:23
【问题描述】:

我有一个枚举的类对象(我有一个Class&lt;? extends Enum&gt;),我需要得到这个枚举表示的枚举值的列表。 values 静态函数有我需要的,但我不确定如何从类对象中访问它。

【问题讨论】:

  • 它的静态 - 反射。
  • Class 是一个反射对象(它早于包)。

标签: java enums


【解决方案1】:

【讨论】:

    【解决方案2】:

    如果你知道你需要的值的名称:

         Class<? extends Enum> klass = ... 
         Enum<?> x = Enum.valueOf(klass, "NAME");
    

    如果你不这样做,你可以通过(就像汤姆首先得到的那样)获得它们的数组:

         klass.getEnumConstants();
    

    【讨论】:

      【解决方案3】:

      使用 reflection 很简单,就像调用 Class#getEnumConstants():

      List<Enum<?>> enum2list(Class<? extends Enum<?>> cls) {
         return Arrays.asList(cls.getEnumConstants());
      }
      

      【讨论】:

        【解决方案4】:

        我很惊讶没有提到EnumSet#allOf()

        public static &lt;E extends Enum&lt;E&gt;&gt; EnumSet&lt;E&gt; allOf(Class&lt;E&gt; elementType)

        创建一个枚举集,其中包含指定元素类型中的所有元素。

        考虑以下enum

        enum MyEnum {
          TEST1, TEST2
        }
        

        只需像这样调用方法:

        Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class);
        

        当然,这会返回 Set,而不是 List,但在许多(大多数?)用例中应该足够了。

        或者,如果你有一个未知的enum

        Class<? extends Enum> enumClass = MyEnum.class;
        Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass);
        

        Class#getEnumConstants() 相比,此方法的优势在于它是键入的,因此除了enum 之外,无法传递任何其他内容。例如下面的代码是有效的,返回null

        String.class.getEnumConstants();
        

        虽然这不会编译:

        EnumSet.allOf(String.class); // won't compile
        

        【讨论】:

        • 看起来这种方法会更快。反射方法克隆使用反射和安全 API 构建的共享数组。 EnumSet 使用存储在 long 中的“位向量”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多