Java JDK1.7-检索值中带有点的枚举常量
我使用的是第三方库,它有一个enum类,如下所示:Java JDK1.7-检索值中带有点的枚举常量,java,enums,jdk1.7,Java,Enums,Jdk1.7,我使用的是第三方库,它有一个enum类,如下所示: 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()
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));
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;
}
}
static Version byUrlElement(String urlElement) {
for (Version version : Version.values()) {
if (version.getUrlElement().equals(urlElement)) {
return version;
}
}
return null;
}
我得到以下例外:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant com.pkg.Version.v2.2
似乎“v2.2”没有被视为单个字符串。我尝试了两种方法来逃逸字符串中的圆点,但都不起作用。我正在使用JDK1.7。因此,如果有人遇到此问题,请给出建议。您需要添加一个方法,根据您的value属性查找
enum
常量。它可能看起来像这样:
String str="v2.2"; //this i get from a props file
System.out.println("version enum: "+Version.valueOf(str));
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;
}
}
static Version byUrlElement(String urlElement) {
for (Version version : Version.values()) {
if (version.getUrlElement().equals(urlElement)) {
return version;
}
}
return null;
}
然后您可以按如下方式进行查找:
Version version = Version.byValue("v2.2");
如果性能很重要,您可能希望添加一个映射,以避免对枚举值进行迭代,并加快查找速度
更新
如果无法修改enum
本身,则可以在您确实可以访问的另一类中实现相同的机制。根据您更新的代码,它将如下所示:
String str="v2.2"; //this i get from a props file
System.out.println("version enum: "+Version.valueOf(str));
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;
}
}
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);
}
}
由于无法更新枚举,因此请编写一个程序,按值返回枚举名称。
public静态字符串getEnumNamebyValue(String str){
public static String getEnumNamebyValue(String str){
for(Version v : Version.values()){
if(v.getVersion().equals(str))
return v.name();
}
return null;
}
对于(版本v:Version.values()){
如果(v.getVersion().equals(str))
返回v.name();
}
返回null;
}
显示完整的enum
声明。您需要添加一个方法来使用值属性查找enum
常量。您好,我已经用完整的enum类更新了问题。正如我在问题中提到的,它是第三方库中的一个类,我无法修改。:)@kaluva枚举公开哪些方法?如果需要,可以在任何地方实现byValue
方法。无需在版本
@RobbyCornelissen中严格实施,感谢您的更新。实际上,我需要在代码中进行http调用时传递这个版本。所以每次这样的评估似乎都是性能瓶颈。我可以根据您的建议考虑MAP选项,以避免这种性能冲击。只是想知道,除了迭代枚举常量之外,没有其他方法可以在java中支持这一点吗?@kaluva我已经更新,将该方法包括在查找映射中。加载类时,枚举只需迭代一次。