Переопределить valueof () и toString() в перечислении Java
значения в моей enum это слова, которые должны иметь пробелы в них, но перечисления не могут иметь пробелов в своих значениях, поэтому все это сгруппировано. Я хочу переопределить toString() чтобы добавить эти пробелы, где я говорю это.
Я также хочу, чтобы перечисление обеспечивало правильное перечисление, когда я использую valueOf() в той же строке, в которую я добавил пробелы.
например:
public enum RandomEnum
{
StartHere,
StopHere
}
вызов toString() on RandomEnum стоимость которого составляет StartHere возвращает строку "Start Here". Вызов valueof() на той же строке ("Start Here") возвращает значение типа enum StartHere.
как я могу это сделать?
7 ответов:
вы можете попробовать этот код. Так как вы не можете переопределить
valueOfметод вы должны определить пользовательский метод (getEnumв примере кода ниже), который возвращает значение, которое вам нужно, и изменить ваш клиент, чтобы использовать этот метод вместо этого.public enum RandomEnum { StartHere("Start Here"), StopHere("Stop Here"); private String value; RandomEnum(String value) { this.value = value; } public String getValue() { return value; } @Override public String toString() { return this.getValue(); } public static RandomEnum getEnum(String value) { for(RandomEnum v : values()) if(v.getValue().equalsIgnoreCase(value)) return v; throw new IllegalArgumentException(); } }
попробуйте это, но я не уверен, что будет работать везде :)
public enum MyEnum { A("Start There"), B("Start Here"); MyEnum(String name) { try { Field fieldName = getClass().getSuperclass().getDeclaredField("name"); fieldName.setAccessible(true); fieldName.set(this, name); fieldName.setAccessible(false); } catch (Exception e) {} } }
Как насчет реализации Java 8? (null может быть заменен вашим перечислением по умолчанию)
public static RandomEnum getEnum(String value) { List<RandomEnum> list = Arrays.asList(RandomEnum.values()); return list.stream().filter(m -> m.value.equals(value)).findAny().orElse(null); }или вы могли бы использовать:
...findAny().orElseThrow(NotFoundException::new);
вы можете использовать статическую карту в своем перечислении, которая сопоставляет строки с константами перечисления. Используйте его в статическом методе "getEnum". Это пропускает необходимость повторять перечисления каждый раз, когда вы хотите получить один из его строкового значения.
public enum RandomEnum { StartHere("Start Here"), StopHere("Stop Here"); private final String strVal; private RandomEnum(String strVal) { this.strVal = strVal; } public static RandomEnum getEnum(String strVal) { if(!strValMap.containsKey(strVal)) { throw new IllegalArgumentException("Unknown String Value: " + strVal); } return strValMap.get(strVal); } private static final Map<String, RandomEnum> strValMap; static { final Map<String, RandomEnum> tmpMap = Maps.newHashMap(); for(final RandomEnum en : RandomEnum.values()) { tmpMap.put(en.strVal, en); } strValMap = ImmutableMap.copyOf(tmpMap); } @Override public String toString() { return strVal; } }просто убедитесь, что статическая инициализация карты происходит ниже объявления констант перечисления.
BTW-это тип "ImmutableMap" из API Google guava, и я определенно рекомендую его в таких случаях, как этот.
редактировать-в комментариях:
- это решение предполагает, что каждому присваивается строковое значение является уникальным и не-null. Учитывая, что создатель перечисления может управлять этим, и что строка соответствует уникальному и ненулевому значению перечисления, это кажется безопасным ограничением.
- я добавил метод ' toSTring ()', как указано в вопросе
У вас все еще есть возможность реализовать в вашем перечислении это:
public static <T extends Enum<T>> T valueOf(Class<T> enumType, String name){...}
Я не думаю, что вы собираетесь получить valueOf("начать здесь") для работы. Но что касается пространств...попробовать следующее...
static private enum RandomEnum { R("Start There"), G("Start Here"); String value; RandomEnum(String s) { value = s; } } System.out.println(RandomEnum.G.value); System.out.println(RandomEnum.valueOf("G").value); Start Here Start Here
ниже приведена хорошая общая альтернатива valueOf ()
public static RandomEnum getEnum(String value) { for (RandomEnum re : RandomEnum.values()) { if (re.description.compareTo(value) == 0) { return re; } } throw new IllegalArgumentException("Invalid RandomEnum value: " + value); }
Comments