0
public enum Foo {
   one ("one"), two ("two")
}

値で列挙を見つける方法 (たとえばFoo.getFoo("two")) は、 を返す必要がありFoo.twoます。

4

4 に答える 4

3

それぞれenumに、valueOf(String)指定された名前のインスタンスを検索するメソッドがあります。

Foo.valueOf("one") == Foo.one

これは、列挙値の名前に基づいています。列挙型には、値自体の概念はありません。名前と序数だけです。

于 2012-08-02T03:17:00.260 に答える
1

いくつかのオプションがあります...

列挙型を知っている、名前で調べたい

他の人が指摘したように、正確な列挙型とその名前がわかっている場合は、それを直接使用できます。

Foo myFoo = Foo.valueOf("one");

文字列は、大文字と小文字を含めて列挙名と正確に一致する必要があることに注意してください。通常、列挙型の値はすべて大文字なので、 で検索する場合は、String sを実行することをお勧めしますFoo.valueOf(s.toUpperCase())

列挙型のクラスがあり、名前で検索したい

その型はなく、列挙型を表すクラスがある場合は、静的メソッドEnum.valueOf(Class<T>, String)を使用してその名前の列挙型を取得できます。

Class<T> myEnumClass = whatever();
T myEnum = Enum.valueOf(myEnumClass, "one");

上記のように、文字列は大文字と小文字が区別されます。

名前以外の属性で検索したい

他の (おそらく一意の) 値で列挙型を検索する場合、1 つの方法は列挙型の値をループすることです。から取得できますFoo.values()。または、 しかない場合はClass<T>、インスタンス メソッドを使用できますClass.getEnumConstants()

T[] values = myEnumClass.getEnumConstants();
for (T value : values) ...

同じですが、潜在的に高速です

これを頻繁に行う必要があり、速度が問題になる場合は、これらをマップに事前にロードしておくと便利な場合があります (ただし、注意事項については以下を参照してください)。

Map<EnumVal, Foo> valuesToEnum = new HashMap<EnumVal, Foo>();
for (Foo foo : Foo.values()) {
    EnumVal val = foo.getValue();
    Foo oldFoo = valuesToEnum.put(val, foo);
    assert oldFoo == null : "multiple Foos have a value " + val;
        // ^^^ this means we can't meaningfully look up by EnumVals.
}
// now you can do something like
EnumVal lookupBy = whatever2();
Foo foo = valuesToEnum.get(lookupBy);
if (foo == null)
    throw new IllegalArgumentException("no Foo has the value " + lookupBy);

これには、EnumVal事前に計算されていない場合は のハッシュを計算してから、いくつかのルックアップが必要であることに注意してください。列挙型に多くの値がある場合、このルックアップは価値があります。それ以外の場合、一握りのアイテムのループは、プラスまたはマイナスとほぼ同じくらい高速である可能性が高く、どちらの方法でも無視できます。

于 2012-08-02T06:30:04.473 に答える
0

valueOf(String)、宣言された の に対してのみ機能します。カスタム値で検索したい場合、最良の方法は find メソッドを提供することです:nameEnumenum

public static Foo fromValue(String value) {
    for (Foo foo : Foo.values()) {
        if (foo.value.equals(value)) {
            return foo;
        }
    }
}
于 2012-08-02T03:53:59.963 に答える
0

特にあなたの場合、Foo.valueOf(String)それをします。

于 2012-08-02T03:18:15.167 に答える