如何在Java中获取所有枚举值?

127

我遇到了这个问题,即在不知道实际所需的enum类型的情况下,需要迭代其可能的值。

if (value instanceof Enum){
   Enum enumValue = (Enum)value;
}

有什么办法可以从enumValue中提取其可能的值?

8个回答

182

调用Class#getEnumConstants方法获取枚举元素(如果不是枚举类则为null)。

Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();

1
你为什么要使用getDeclaringClass()? - Peter Kriens
8
因为枚举对象上的 getClass() 方法可能返回枚举类型本身的子类型(如果枚举常量覆盖了枚举类型的方法),所以在这里你需要使用 getDeclaringClass() 方法,它会返回声明该常量的枚举类型。 - ColinD
谢谢!我没有意识到这个问题,但是你是对的,常量可以是匿名内部类。 - Peter Kriens

126
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

或者

YourEnumClass[] yourEnums = YourEnumClass.values();

16
< p >枚举类型(Enum)和类(Class)一样具有类型。当前代码只是检查它是否为枚举类型,但没有指定其所属的枚举类型。

因为您没有指定枚举类型,所以必须使用反射来查找枚举值列表。

可以按以下方式实现:

enumValue.getDeclaringClass().getEnumConstants() 

这将返回一个枚举对象数组,每个对象都是可用选项之一。


15

枚举的values()方法返回所有枚举实例。

  public class EnumTest {
        private enum Currency {
        PENNY("1 rs"), NICKLE("5 rs"), DIME("10 rs"), QUARTER("25 rs");
        private String value;
        private Currency(String brand) {
              this.value = brand;
        }

        @Override
        public String toString() {
              return value;
        }
  }

  public static void main(String args[]) {

        Currency[] currencies = Currency.values();

        // enum name using name method
        // enum to String using toString() method
        for (Currency currency : currencies) {
              System.out.printf("[ Currency : %s,
                         Value : %s ]%n",currency.name(),currency);
        }
  }
}

http://javaexplorer03.blogspot.in/2015/10/name-and-values-method-of-enum.html


9

我应该使用MyEnum.valueOf()还是MyEnum.values()?或者我漏掉了什么吗?


3
是的,在这里实际枚举类不可用于进行静态方法调用,只能使用某个 Enum 子类型的实例。 - ColinD

7

这里,Role是一个枚举类型,包含以下值[ADMIN, USER, OTHER]。

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });

然而,这并不是通用的。问题在于只有枚举对象的情况下。因此,您需要通过声明类或更好地通过EnumSet来解决。 - zeratul021

6

您也可以像这样使用java.util.EnumSet:

@Test
void test(){
    Enum aEnum =DayOfWeek.MONDAY;
    printAll(aEnum);
}

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}

3
任何试图将所有值作为列表获取的人都可以简单地执行此操作。
Arrays.asList(YouEnumClass.values())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接