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);

目前我在所有地方都使用枚举,但对于这些元素,我使用 table。我想协调这个

顺便说一句,由于一些依赖关系,我使用 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

您可以使用 Map 将枚举与特殊字符配对。

myElements.valueOf(my_string);

可能

MyClass.translateToEnum(my_string);

这将使用您的 Map 对象来确定要返回的枚举。

于 2012-06-27T14:18:25.887 回答
0

您可以覆盖每个枚举的 toString 方法来保存您需要的值。我不确定这是否是你所追求的?

于 2012-06-27T14:17:05.763 回答