Как создать метод, принимающий любой Enum в Java?
Имеется несколько Enum:
public enum Colours {
RED, BLUE, WHITE;
}
public enum Modification {
FULL, SIMPLE;
}
Как создать метод, который в качестве аргумента будет принимать любой типа перечисления (или TypeColour или Modification ) и возвращать значение, тип которого равен типу аргумента? Имеется множество перечислений и хочется сделать один универсальный метод:
Modification mod = getAnyEnum(Modification, "SIMPLE");
// mod = Modification.SIMPLE;
или
Colours col = getAnyEnum(Colours , "RED");
// mod = Modification.SIMPLE;
Чтобы получилось что-то типа такого:
private <E extends Enum<E>> E getAnyEnum(E type, String tagName) {
//сделать что-то типа
E newType = E.values(); //или метод valueOf();
for(E type: list) {
if(type.getValue.equals(tagName)) {
return type;
}
}
}
Ответы (1 шт):
Это - перевод ответа https://stackoverflow.com/a/1723239/4908529
Обратите внимание на комментарии: основные претензии - к пустому catch-блоку, что считается моветоном. Публикуемый метод возвращает NULL, если значение, соответствующее строковому представлению не найдено.
/**
* A common method for all enums since they can't have another base class
* @param <T> Enum type
* @param c enum type. All enums must be all caps.
* @param string case insensitive
* @return corresponding enum, or null
*/
public static <T extends Enum<T>> T getEnumFromString(Class<T> c, String string) {
if( c != null && string != null ) {
try {
return Enum.valueOf(c, string.trim().toUpperCase());
} catch(IllegalArgumentException ex) {
}
}
return null;
}
Пример использования:
public static MyEnum fromString(String name) {
return getEnumFromString(MyEnum.class, name);
}
Если значения вашего Enum использует не только заглавные буквы - нужно будет изменить часть кода string.trim().toUpperCase() на более подходящую для вашей нотации.