1

私は現在パーサーに取り組んでいます。私は木を歩きますが、そのほとんどはかなり決定論的です(見つけることができる値の数には限りがあります)。

通常、これらの場合、次のように、検索する予定の値の名前で列挙型を作成します。

public enum myElements{
    like, 
    not_like,// "not like" is transformed in not_like by parser
    exists;
}   

この場合、文字列が列挙型に属しているかどうかを次のように確認できます。

String my_string;
myElements.valueOf(my_string);

現在、特殊文字({"> "、 "<"、 "<>"、...)を使用しています。特殊文字を使用して列挙値を作成することはできません。

私が欲しいのは、列挙型をそれらの特殊文字要素に関連付けることです。

public enum myElements{
    greather_than(">"), 
    smaller_than("<")
}

そして、次のように簡単なものを使い続けます。

myElements.valueOf(my_string);

今のところ、私はどこでも列挙型を使用していますが、これらの要素では、テーブルを使用しています。これを調和させたい

ところで、いくつかの依存関係があるため、私はJava6を使用しています。

アイデアは大歓迎です、ありがとう!

編集 :

これが私が使用している現在のテーブルバージョンの例です:

public static String[] compElements = {">", "<", "<>", "=", "<=", ">="};

valueOfと同等のもの:

Arrays.asList(compElements).contains(my_string);
4

3 に答える 3

2

列挙型にすべての「柔軟な」名前のマップを格納し、名前を列挙型の値にマッピングしたいようです。を使用することはできませんがvalueOf、関連するマップされた値を返す独自の静的メソッドを簡単に作成できます。静的初期化ブロックにマップを作成します。(コンストラクターが自動的に呼び出された場合、静的初期化子は実行されないことを忘れないでください。)

サンプルコード:

public enum Foo {
  // Idiomatic Java names. You could ignore those if you really want,
  // and overload the constructor to have a parameterless one which calls
  // name() if you really want.
  FIRST("first"),
  SECOND("second"),
  WITH_SPACE("with space");

  private static final Map<String, Foo> nameToValueMap;

  static {
    // Really I'd use an immutable map from Guava...
    nameToValueMap = new HashMap<String, Foo>();
    for (Foo foo : EnumSet.allOf(Foo.class)) {
      nameToValueMap.put(foo.friendlyName, foo);
    }
  }

  private final String friendlyName;

  private Foo(String friendlyName) {
    this.friendlyName = friendlyName;
  }

  public String getFriendlyName() {
    return friendlyName;
  }

  public static Foo fromFriendlyName(String friendlyName) {
    return nameToValueMap.get(friendlyName);
  }
}
于 2012-06-27T14:17:54.777 に答える
1

マップを使用して、列挙型を特殊文字とペアにすることができます。

myElements.valueOf(my_string);

になり得る

MyClass.translateToEnum(my_string);

これは、Mapオブジェクトを使用して、返す列挙型を決定します。

于 2012-06-27T14:18:25.887 に答える
0

各列挙型のtoStringメソッドをオーバーライドして、必要な値を保持できます。これがあなたが求めているものかどうかわかりませんか?

于 2012-06-27T14:17:05.763 に答える