如何将 "value" 转换为枚举?

how to convert "value" to enum?

我有这个枚举 class:

public enum IconImageTag {

    None("val1"),
    USD("val2"),
    EURO("val3");
}

给定一个代表 "value" 的字符串(比如 `"val"1)

如何将其转换为相应的枚举?

更新

这个我试过了。为什么从 ctor 访问静态成员是非法的?我收到一个错误。

  private final String value;
    private static final Map<String, IconImageTag> stringToEnumMap = new HashMap<>();

    IconImageTag(String value) {
        this.value = value;
        stringToEnumMap.put(value, this);
    }

理想情况下,您可以构建一个 Map<String, IconImageTag> 并添加适当的方法。例如:

public enum IconImageTag {
    NONE("val1"),
    USD("val2"),
    EURO("val3");

    private final String value;

    private final Map<String, IconImageTag> valueMap = new HashMap<>();

    static {
        for (IconImageTag tag : values()) {
            valueMap.put(tag.value, tag);
        }
    }

    private IconImageTag(String value) {
        this.value = value;
    }

    public static IconImageTag fromValue(String value) {
        return valueMap.get(value);
    }
}

(我可能会在这里使用与 "value" 不同的术语,以避免与 valueOf() 等混淆...)

注意静态初始化程序块的使用 - 枚举中的任何静态变量都在 枚举值本身之后初始化,这意味着当枚举构造函数运行时,valueMap 仍然为空。

您还可以遍历每个枚举。

public enum IconImageTag {

None("val1"),
USD("val2"),
EURO("val3");

private final String value;
private IconImageTag(String value) {
  this.value = value;
}

public String getValue() {
  return value;
}

public static IconImageTag getByValue(String value) {
  for(IconImageTag iconImageTag : values()) {
    if(iconImageTag.getValue().equals(value)) {
      return iconImageTag;
    }
  }
  return null;
}