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

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


}

我正在从 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。所以有谁遇到过这种情况,请指教。

最佳答案

您需要添加一个方法来根据您的值属性查找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本身无法修改,您可以在您有权访问的另一个类中实现相同的机制。根据您更新的代码,它看起来像这样:

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

    return null;
}

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

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

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

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

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

关于java - JDK1.7 - 检索值中带有点的枚举常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31603436/

相关文章:

在 Eclipse 中运行 Spark Word Count 时出现 Java 错误

java - 单个枚举中的多个值

ios - 如何将 NSCoding 协议(protocol)与枚举一起使用?

java - 多个枚举与一个枚举

java - 降级到 1.7 后执行 java -version 时,我仍然看到 Java 1.8

eclipse - 无法在 Eclipse 中运行 Kotlin 应用程序

java - (Java) 使用 Math.acos 时 double 中出现奇怪的 NaN

Java 类路径 - Linux

Java,文件阅读器,进入无限循环

java - 使用XQJ进行简单查询