Какой самый простой и / или самый короткий способ получить имена элементов перечисления в виде массива String
s?
Я имею в виду, что если, например, у меня было следующее перечисление:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
names()
метод будет возвращать массив { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Ответы:
Вот однострочник для любого
enum
класса:Pre Java 8 по-прежнему однострочный, хотя и менее элегантный:
Это вы бы назвали так:
Если вам просто нужно что-то простое для жестко запрограммированного класса перечисления:
источник
e.getEnumConstants()
чтобы использоватьYourEnumName.values()
YourEnumName.values()
вызывает статический метод класса, который нельзя повторно использовать ни для одного перечисления. ИспользованиеgetEnumConstants()
работает для любого класса enum. Идея этого метода состоит в том, чтобы воссоздать служебный метод, который вы можете вызывать как последнюю строку ответа.Class<? extends Enum<?>> e
?Создайте
String[]
массив для имен и вызовите статическийvalues()
метод, который возвращает все значения перечисления, затем выполните итерацию по значениям и заполните массив имен.источник
values()
13 раз, каждый раз создавая новый массив, вместо кеширования массива в локальной переменной? Зачем использовать toString (), который можно переопределить вместоname()
?name()
до сих пор был метод. как глупо с моей стороны: P Спасибо, чтоВот элегантное решение с использованием Apache Commons Lang 3 :
Хотя он возвращает список, вы можете легко преобразовать список с помощью
list.toArray()
источник
EnumUtils.getEnumList(enumClass)
возвращает значения перечисления, а не строки. Вы можете использоватьEnumUtils.getEnumMap(enumClass).keySet()
, но порядок может быть другим.Если вы можете использовать Java 8, это отлично работает (альтернатива предложению Юры, более эффективная):
источник
С java 8:
источник
Я бы написал это так
источник
Другие способы:
Первый
Другой путь
источник
toString()
работает, но в общем случае нет, потому чтоtoString()
это можно изменить. Используйте ,.name()
чтобы надежно получить экземпляр имя в виде строки.Что-то вроде этого подойдет:
В документации рекомендуется использовать
toString()
вместоname()
в большинстве случаев , но вы явно запросили здесь имя.источник
values()
вызывается дважды, когда его нужно вызывать только один раз.values()
это метод, созданный компилятором, поэтому я предполагаю, что он довольно оптимизирован. Наконец, я помню, как где-то читал, что циклы for-each более эффективны, чем стандартные, инкрементные циклы for, но опять же - это просто не имеет значения .for (int i = 0; i < a.length; i++) /* do stuff */;
В этом случае, каждая-петля , является , по сути, более эффективным. Быстрый поиск SO по этому вопросу дает нам следующее: stackoverflow.com/questions/2113216/…Мое решение с манипуляциями со строками (не самое быстрое, но компактное):
источник
Я бы сделал это так (но я бы, вероятно, сделал бы имена неизменяемым набором вместо массива):
источник
names()
метод вызывается редко, я думаю, что создание массива на месте - это нормально.У меня такая же потребность, и я использую общий метод (внутри класса ArrayUtils):
И просто определите СТАТИК внутри перечисления ...
В перечислениях Java действительно отсутствуют методы names () и get (index), они действительно полезны.
источник
обычный способ (каламбур):
источник
Я немного протестировал решение @ Bohemian. При использовании наивного цикла производительность лучше.
источник
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
источник
EnumUtils
?Если вам нужен самый короткий, вы можете попробовать
источник
vales()
один раз)Подумайте: возможно, вам не нужно создавать метод для возврата значений перечисления в виде массива строк.
Зачем нужен массив строк? Может быть, вам нужно преобразовать значения только при их использовании, если вам когда-нибудь понадобится.
Примеры:
источник
Другой способ сделать это в Java 7 или более ранней версии - использовать Guava:
источник
Попробуй это:
источник
Вы можете поместить значения перечисления в список строк и преобразовать их в массив:
источник
Самый простой способ:
Где Категория - это
Enum
имяисточник