我正在使用一个第三方库,它有一个枚举类,如下所示:
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/