我正在使用第三方库,它有一个枚举类,如下所示:
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.所以有人遇到过这个,请指教.
您需要添加一个方法来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)
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |