Javaですべての列挙値を取得するにはどうすればよいですか?


95

この問題に遭遇したのは、実際のenum型を知らずに、可能な値を反復する必要があるということです。

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

enumValueから可能な値を抽出する方法はありますか?

回答:


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

なぜgetDeclaringClass()を使用するのですか?
Peter Kriens 2017年

3
@PeterKriens:ためgetClass()enumオブジェクトを返すことができるサブタイプenum(たとえば、場合種類自体をenum定数からメソッドをオーバーライドenumタイプ)。ここでは、その定数を宣言しgetDeclaringClass()enum型を返します。
ColinD 2017年

ありがとう!私はそのケースに気づいていませんでしたが、あなたが正しい、定数は匿名の内部クラスである可能性があります。
Peter Kriens 2017年

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

または

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();非静的メソッドから呼び出す私の問題を解決しました。
ジェレミー

15

EnumsはClassesと同様に入力されます。現在のコードは、それが一部であるEnumのタイプを指定せずに、それがEnumかどうかをチェックするだけです。

列挙型を指定していないため、リフレクションを使用して列挙値のリストを確認する必要があります。

あなたはそうすることができます:

enumValue.getDeclaringClass().getEnumConstants() 

これは、それぞれが使用可能なオプションの1つであるEnumオブジェクトの配列を返します。


14

列挙型の値メソッド

すべてのenumインスタンスを返す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 2010

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);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.