2015-07-24 3 views
2

Я использую библиотеку, которая стороннего программного имеет класс перечислимую, который, как показано ниже: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; 
    } 


} 

Я читала версию из реквизита файла, который я хочу перейти к этому перечисление, чтобы получить соответствующую константу перечисления, как это:

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. Так кто-нибудь столкнулся с этим, пожалуйста, посоветуйте.

+1

Показать полное объявление 'enum'. Вам нужно будет добавить метод для поиска константы 'enum', используя ваши значения. –

+1

Привет, я обновил вопрос с полным классом enum. – kaluva

ответ

6

Вам нужно будет добавить метод для поиска константы 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"); 

Если производительность важна, вы можете добавить карту, чтобы избежать итерации над перечислимого значения и ускорить поиск.

Update

Если сам enum не может быть изменен, вы можете реализовать один и тот же механизм, в другом классе, что у вас есть доступ. В соответствии с обновленным кодом, он будет выглядеть следующим образом:

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"); 
+0

Как я упомянул в своем вопросе, его класс из библиотеки thirdparty, который я не могу изменить. :) – kaluva

+0

@kaluva Какие методы выдает enum? –

+2

При необходимости вы можете реализовать метод 'byValue' везде, где хотите. В «Версии» нет строгой необходимости реализовать ее. – BetaRide

0

Поскольку вы не можете обновить Enum, напишите программу, которая возвращает значение Enum Name по значению.

public static String getEnumNamebyValue(String str){ 
     for(Version v : Version.values()){ 
      if(v.getVersion().equals(str)) 
       return v.name(); 
     }

return null; }