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


95

我遇到了这个问题,我不知道enum需要迭代其实际值的实际类型。

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

任何想法如何从enumValue中提取其可能的值?

Answers:


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

为什么使用getDeclaringClass()?
彼得·克里恩斯

3
@PeterKriens:因为getClass()在一个enum对象上可能返回该类型本身的enum类型(例如,如果enum常量覆盖该enum类型的方法)。getDeclaringClass()返回enum声明该常量的类型,这就是您想要的。
ColinD

谢谢!我没有意识到这种情况,但是您是对的,常量可以是匿名内部类。
彼得·克里恩斯

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

要么

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();解决了我从非静态方法调用的问题。
杰里米(Jeremy)

15

Enum就像Classes 一样,它们被键入。您当前的代码只是检查它是否为枚举,而未指定它属于哪种枚举。

由于尚未指定枚举类型,因此必须使用反射来找出枚举值列表。

您可以这样做:

enumValue.getDeclaringClass().getEnumConstants() 

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


14

枚举值方法

enum.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


7

...或MyEnum.values()吗?还是我错过了什么?


2
是的,这里没有枚举的实际类可以用来进行静态方法调用,而只是Enum某些子类型的实例。
ColinD

3

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

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

但是,这不是通用的。问题是只有Enum对象时的情况。因此,您需要通过EnumSet声明类或更好。
zeratul021

3

这样也可以使用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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.