JDK1.7 - 检索枚举常量,其值为点

kal*_*uva 2 java enums jdk1.7

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

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


}
Run Code Online (Sandbox Code Playgroud)

我正在从道具文件中读取版本,我想传递给这个枚举,以获得各自的枚举常量,如下所示:

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

我得到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.pkg.Version.v2.2
Run Code Online (Sandbox Code Playgroud)

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

Rob*_*sen 6

您需要添加一个方法来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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Version version = Version.byValue("v2.2");
Run Code Online (Sandbox Code Playgroud)

如果性能很重要,您可能需要添加映射以避免迭代枚举值并加快查找速度.

更新

如果enum无法修改自身,则可以在您有权访问的另一个类中实现相同的机制.与您更新的代码一致,它看起来像这样:

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

    return null;
}
Run Code Online (Sandbox Code Playgroud)

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

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

static {
    for (Version version : Version.values()) {
        VERSION_INDEX.put(version.getUrlElement(), version);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Version version = VERSION_INDEX.get("v2.2");
Run Code Online (Sandbox Code Playgroud)

  • 如有必要,您可以随时随地实现`byValue`方法.没有严格的需要在`Version`中实现它. (2认同)