2

私はいくつかの列挙型を持っていますが、すべて異なるもので、文字列が列挙型変数名の 1 つであるかどうかを検出できる関数を作成したいと考えています (本当に理解できるかどうかはわかりません)。

enum MYENUM {
  ONE,
  TWO;
}

enum MYENUM1 {
  RED,
  GREEN;
}

私はこれをしたいです(これは単なる例です。私の列挙型はより複雑です):

if(isInEnum(MYENUM, "one")) ...
if(isInEnum(MYENUM1, "one")) ...

isinEnum関数(コードは悪いです、理解するためだけです):

boolean isinEnum(enum enumeration, String search) {
  for(enum en : enumeration.values()){
    if(en.name().equalsIgnoreCase(search)) return true;
  }
  return false;
}

このようなことは可能ですか?

Webで読むことができるものによると、そうではないと思いますが、列挙型ごとに1つのループを作成する代わりに、誰かがこれを行うための解決策を持っているかもしれません。

4

3 に答える 3

1

これがリフレクションを使用する方法です...

public class EnumFinder {

    public static <T extends Enum<T>>  boolean isInEnum(Class<T> clazz, String name) {
        for (T e : clazz.getEnumConstants()) {
            if (e.name().equalsIgnoreCase(name)) {
                return true;
            }
        }

        return false;
    }

    public static void main(String[] argv) {
        System.out.println(isInEnum(MYENUM.class, "one"));   // true
        System.out.println(isInEnum(MYENUM1.class, "one"));  // false
    }
}

あなたの答えのあなたの試みは実際には非常に近かった。唯一の違いは、Javaが実行時に未知の型に関する質問に動的に答えるために、定義クラスのインスタンスを必要とすることです。

于 2012-05-28T03:03:48.527 に答える
1

これは、通常のプログラム フローで例外を使用するため、最もクリーンなソリューションではないかもしれませんが、ループを回避するため、確かに短いです。

boolean isinEnum(Class<T> enumClass, String search) {
    try {
        Enum.valueOf(enumClass, search);
        return true;
    } catch (IllegalArgumentException iae) {
        return false;
    }
}
于 2012-05-28T03:00:08.213 に答える
0

あなたの質問は理解するのが少し難しいですが、私はそれの要点を理解していると思います.

必要以上に物事を自分に厳しくしている可能性があります。

Java のマップ インターフェイス/データ構造 (java.util 内) を見て、ソリューションに近づくかどうかを確認します。

java.util Interface Map<K,V>

そうでない場合は、あなたが行ったレッグワークを再投稿してください。さらにあなたを助けることができるかどうかを確認します. ;-)

于 2012-05-28T02:59:34.157 に答える