2014-10-02 4 views
1

Возможно ли создать метод или класс generic для получения значения перечисления из заданного уникального свойства (поле с методом геттера)?Получить значение перечисления с использованием уникального свойства

Таким образом, вы бы:

public enum EnumToMap { 
    E1("key1"), 
    E2("key2"), 
    ; 

    private final String key; 

    private EnumToMap(String key) { 
     this.key = key; 
    } 

    public String getKey() { 
     return key; 
    } 
} 

так требуется та же функциональность, как

public static EnumToMap getByKey(String key) 
    ... 

обеспечит. Предпочтительно без отражения и как можно более общее (но в этом случае может быть невозможно создать общее решение без отражения).

Уточнение: поэтому этот метод должен работать для нескольких перечислений. Идея заключается не в том, чтобы повторять поиск снова и снова.

+0

Не можете ли вы сделать это с помощью 'toString' и' valueOf'? – 5gon12eder

+0

Конечно, вы можете, но только для «E1» и «E2». –

+0

by generic u означает, что вы хотите использовать его с разными перечислениями? – damienix

ответ

5

Фактически возможно только с генериками и интерфейсом.

Создание и внедрение интерфейс

interface WithKeyEnum { 
    String getKey(); 
} 

enum EnumToMap implements WithKeyEnum { 
    ... 

    @Override 
    public String getKey() { 
     return key; 
    } 
} 

осуществления

public static <T extends Enum<T> & WithKeyEnum> T getByKey(Class<T> enumTypeClass, String key) { 
    for (T type : enumTypeClass.getEnumConstants()) { 
     if (type.getKey().equals(key)) { 
      return type; 
     } 
    } 
    throw new IllegalArgumentException(); 
} 

Использование

EnumToMap instanceOfE1 = getByKey(EnumToMap.class, "key1"); 
+0

Nice. Требуется интерфейс для геттера, но я думаю, что это не поможет без размышлений. –

+2

Лучше использовать интерфейс, чем использовать отражение;) – damienix

+0

Вопрос будет, если это того стоит. Я не говорю, что будет лучший ответ, но определение интерфейса и метода для каждого получателя почти так же многословно. Ваш другой ответ, который вы предоставили, - это маршрут, который в основном используется, но он не является общим; его необходимо внедрять снова и снова. –

0

Если вы хочу бросить родовыми и получить O (1) использование сложности HashMap получить его

public enum EnumToMap{ 
    E1("key1"), 
    E2("key2"); 

    private final String key; 

    private static final Map<String, EnumToMap> keys = new HashMap<String, EnumToMap>(); 
    static { 
     for (EnumToMap value : values()) { 
      keys.put(value.getKey(), value); 
     } 
    } 

    private EnumToMap(String key) { 
     this.key = key; 
    } 

    public String getKey() { 
     return key; 
    } 

    public static EnumToMap getByKey(String key) { 
     return keys.get(key); 
    } 
} 

Это было бы трудно просто generify поскольку должен быть объектом хранить карту. Кажется, что Enum является хорошим кандидатом на это.

Смежные вопросы