3

我正在使用具有枚举类的第三方库,如下所示:

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

我遇到了以下异常:

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

似乎“v2.2”没有被视为单个字符串。我通过转义字符串中的点尝试了几种方法,但它们都不起作用。我正在使用JDK1.7。所以有谁遇到过,请指教。

4

2 回答 2

7

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

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不能修改自身,您可以在您有权访问的另一个类中实现相同的机制。根据您更新的代码,它看起来像这样:

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");
于 2015-07-24T06:22:47.900 回答
0

由于您无法更新枚举,因此请编写一个按值返回枚举名称的程序。

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

return null; }
于 2015-07-24T06:49:29.433 回答