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

Java JDK1.7-检索值中带有点的枚举常量,java,enums,jdk1.7,Java,Enums,Jdk1.7,我使用的是第三方库,它有一个enum类,如下所示: 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()

我使用的是第三方库,它有一个enum类,如下所示:

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


}
我正在读取props文件中的版本,我希望将其传递到此枚举以获得相应的枚举常量,如下所示:

String str="v2.2"; //this i get from a props file    
System.out.println("version enum: "+Version.valueOf(str));
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;
    }
}
static Version byUrlElement(String urlElement) {
    for (Version version : Version.values()) {
        if (version.getUrlElement().equals(urlElement)) {
            return version;
        }
    }

    return null;
}
我得到以下例外:

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

似乎“v2.2”没有被视为单个字符串。我尝试了两种方法来逃逸字符串中的圆点,但都不起作用。我正在使用JDK1.7。因此,如果有人遇到此问题,请给出建议。

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

String str="v2.2"; //this i get from a props file    
System.out.println("version enum: "+Version.valueOf(str));
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;
    }
}
static Version byUrlElement(String urlElement) {
    for (Version version : Version.values()) {
        if (version.getUrlElement().equals(urlElement)) {
            return version;
        }
    }

    return null;
}
然后您可以按如下方式进行查找:

Version version = Version.byValue("v2.2");
如果性能很重要,您可能希望添加一个映射,以避免对枚举值进行迭代,并加快查找速度

更新

如果无法修改
enum
本身,则可以在您确实可以访问的另一类中实现相同的机制。根据您更新的代码,它将如下所示:

String str="v2.2"; //this i get from a props file    
System.out.println("version enum: "+Version.valueOf(str));
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;
    }
}
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);
    }
}

由于无法更新枚举,因此请编写一个程序,按值返回枚举名称。
public静态字符串getEnumNamebyValue(String str){
public static String getEnumNamebyValue(String str){
        for(Version v : Version.values()){
            if(v.getVersion().equals(str))
                return v.name();
        }

return null; }
对于(版本v:Version.values()){ 如果(v.getVersion().equals(str)) 返回v.name(); }

返回null; }
显示完整的
enum
声明。您需要添加一个方法来使用值属性查找
enum
常量。您好,我已经用完整的enum类更新了问题。正如我在问题中提到的,它是第三方库中的一个类,我无法修改。:)@kaluva枚举公开哪些方法?如果需要,可以在任何地方实现
byValue
方法。无需在
版本
@RobbyCornelissen中严格实施,感谢您的更新。实际上,我需要在代码中进行http调用时传递这个版本。所以每次这样的评估似乎都是性能瓶颈。我可以根据您的建议考虑MAP选项,以避免这种性能冲击。只是想知道,除了迭代枚举常量之外,没有其他方法可以在java中支持这一点吗?@kaluva我已经更新,将该方法包括在查找映射中。加载类时,枚举只需迭代一次。