Я хотел бы найти перечисление из его строкового значения (или, возможно, любого другого значения). Я пробовал следующий код, но он не позволяет статический в инициализаторах. Есть ли простой способ?
public enum Verbosity {
BRIEF, NORMAL, FULL;
private static Map<String, Verbosity> stringMap = new HashMap<String, Verbosity>();
private Verbosity() {
stringMap.put(this.toString(), this);
}
public static Verbosity getVerbosity(String key) {
return stringMap.get(key);
}
};
stringMap
инициализации). Обычное решение - использовать вложенный класс.Ответы:
Используйте
valueOf
метод, который автоматически создается для каждого Enum.Для произвольных значений начните с:
Перейдите к реализации Map только позже, если ваш профилировщик скажет вам об этом.
Я знаю, что он перебирает все значения, но с только тремя значениями перечисления вряд ли стоит каких-либо других усилий, на самом деле, если у вас не много значений, я бы не стал возиться с картой, это будет достаточно быстро.
источник
IllegalArgumentException
вместо того, чтобы возвращать ноль ( то есть, когда совпадение не найдено) - это то, как JDKEnum.valueOf(..)
делает это, в любом случае.Ты рядом. Для произвольных значений попробуйте что-то вроде следующего:
источник
HashMap<>
для хранения перечислений, которые оказались более чем на 40% быстрее, чем петля.с Java 8 вы можете достичь с помощью этого способа:
источник
null
. Но это также зависит от случая использования@ Ответ Лайла довольно опасен, и я видел, что он не работает, особенно если сделать enum статическим внутренним классом. Вместо этого я использовал что-то вроде этого, которое будет загружать карты BootstrapSingleton до перечисления.
Редактировать это больше не должно быть проблемой с современными JVM (JVM 1.6 или выше), но я думаю, что с JRebel все еще есть проблемы, но у меня не было возможности повторно протестировать его .
Загрузи меня первым:
Теперь загрузите его в конструктор enum:
Если у вас есть внутреннее перечисление, вы можете просто определить Map над определением перечисления, и это (теоретически) должно быть загружено раньше.
источник
И вы не можете использовать valueOf () ?
Редактировать: Кстати, ничто не мешает вам использовать static {} в перечислении.
источник
valueOf
для класса enum, поэтому вам не нужно указывать класс enumClass
.В случае, если это помогает другим, предпочтительный вариант, которого здесь нет в списке, использует функциональность карт Guava :
По умолчанию вы можете использовать
null
, вы можетеthrow IllegalArgumentException
или можетеfromString
вернутьOptional
любое поведение, которое вы предпочитаете.источник
начиная с Java 8 вы можете инициализировать карту в одну строку и без статического блока
источник
Function.identity()
раньше, я нахожу его гораздо более привлекательным с точки зрения текста, чемe -> e
.Возможно, взгляните на это. Это работает для меня. Целью этого является поиск «RED» с «/ red_color». Объявление a
static map
и загрузкаenum
s в него только один раз принесут некоторые преимущества в производительности, еслиenum
s много.Пожалуйста, оставьте свой отзыв.
источник
Вы можете определить свой Enum как следующий код:
Смотрите следующую ссылку для получения дополнительной информации
источник
Если вам нужно значение по умолчанию и вы не хотите создавать справочные карты, вы можете создать статический метод для этого. Этот пример также обрабатывает поиск, где ожидаемое имя будет начинаться с цифры.
Если вам это нужно для вторичного значения, вам сначала нужно создать карту поиска, как в некоторых других ответах.
источник
}
источник
Вы можете использовать
Enum::valueOf()
функцию, предложенную Gareth Davis & Brad Mace выше, но убедитесь, что вы обрабатываете то,IllegalArgumentException
что было бы выброшено, если используемая строка отсутствует в перечислении.источник