JDK1.7 - 检索值中带有点的枚举常量

JDK1.7 - retrieving enum constant with dots in their values

我正在使用第三方库,它有一个枚举 class,如下所示:

public enum Version { 
VERSION_2_0("v2.0"), 
VERSION_2_1("v2.1"), 
VERSION_2_2("v2.2")

private final String urlElement;

  Version(String urlElement) {
    this.urlElement = urlElement;
  }

  public String getUrlElement() {
    return this.urlElement;
  }

  public boolean isUrlElementRequired() {
    return null != this.urlElement;
  }


}

我正在从道具文件中读取版本,我想将其传递给此枚举以获取相应的枚举常量,如下所示:

String str="v2.2"; //this i get from a props file    
System.out.println("version enum: "+Version.valueOf(str));

我遇到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.pkg.Version.v2.2

似乎 "v2.2" 未被视为单个字符串。我通过转义字符串中的点尝试了几种方法,但其中 none 有效。我正在使用 JDK1.7。所以有遇到过的请指教

您需要添加一种方法来根据您的值 属性 查找 enum 常量。它可能看起来像这样:

public enum Version {
    VERSION_2_0("v2.0"),
    VERSION_2_1("v2.1"),
    VERSION_2_2("v2.2");

    String value;

    Version(String value) {
        this.value = value;
    }

    static Version byValue(String value) {
        for (Version version : Version.values()) {
            if (version.value.equals(value)) {
                return version;
            }
        }

        return null;
    }
}

然后您可以按如下方式进行查找:

Version version = Version.byValue("v2.2");

如果性能很重要,您可能希望添加映射以避免对枚举值进行迭代并加快查找速度。

更新

如果 enum 本身无法修改,您可以在您有权访问的另一个 class 中实施相同的机制。根据您更新的代码,它看起来像这样:

static Version byUrlElement(String urlElement) {
    for (Version version : Version.values()) {
        if (version.getUrlElement().equals(urlElement)) {
            return version;
        }
    }

    return null;
}

或者,如果您想使用地图进一步优化:

private static final Map<String, Version> VERSION_INDEX = new HashMap<>();

static {
    for (Version version : Version.values()) {
        VERSION_INDEX.put(version.getUrlElement(), version);
    }
}

然后您可以使用地图执行查找:

Version version = VERSION_INDEX.get("v2.2");

由于您无法更新枚举,因此编写一个程序,其中 return 按值更新枚举名称。

public static String getEnumNamebyValue(String str){
        for(Version v : Version.values()){
            if(v.getVersion().equals(str))
                return v.name();
        }</p>

    return null;
}