JDK1.7 - 检索值中带有点的枚举常量
JDK1.7 - retrieving enum constant with dots in their values
我正在使用第三方库,它有一个枚举 class,如下所示:
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;
}
}
我正在从道具文件中读取版本,我想将其传递给此枚举以获取相应的枚举常量,如下所示:
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" 未被视为单个字符串。我通过转义字符串中的点尝试了几种方法,但其中 none 有效。我正在使用 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
本身无法修改,您可以在您有权访问的另一个 class 中实施相同的机制。根据您更新的代码,它看起来像这样:
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");
由于您无法更新枚举,因此编写一个程序,其中 return 按值更新枚举名称。
public static String getEnumNamebyValue(String str){
for(Version v : Version.values()){
if(v.getVersion().equals(str))
return v.name();
}</p>
return null;
}
我正在使用第三方库,它有一个枚举 class,如下所示:
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;
}
}
我正在从道具文件中读取版本,我想将其传递给此枚举以获取相应的枚举常量,如下所示:
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" 未被视为单个字符串。我通过转义字符串中的点尝试了几种方法,但其中 none 有效。我正在使用 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
本身无法修改,您可以在您有权访问的另一个 class 中实施相同的机制。根据您更新的代码,它看起来像这样:
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");
由于您无法更新枚举,因此编写一个程序,其中 return 按值更新枚举名称。
public static String getEnumNamebyValue(String str){
for(Version v : Version.values()){
if(v.getVersion().equals(str))
return v.name();
}</p>
return null;
}