Похоже, это простой базовый вопрос
Наличие enum
public enum TK{
ID,GROUP,DATA,FAIL;
}
Можно ли получить номер заказа, например, ID = 0, GROUP = 2, DATA = 3, FAIL = 4?
Это путь к этому, но странный и длинный! = S
public enum TK{
ID(0),GROUP(1),DATA(2),FAIL(3);
int num;
TK(int n)
{
this.num=n;
}
public int get()
{
return num;
}
};
, чтобы получить числа, поэтому я пишу TK.ID.get (), TK.GROUP.get () и т. Д ... Мне там не нравится
лучший способ?
(C перечисления, C макросы .. Я скучаю по вам обоим)
спасибо
порядковый номер ()
делает то, что вы хотите делать. Это отрывок из документации:
Возвращает порядковый номер этой константы перечисления (ее положение в объявлении
enum
, где начальной константе присваивается порядковый номер ноль). Большинству программистов этот метод не нужен. Он разработан для использования сложными структурами данных на основе перечислений, такими какEnumSet
иEnumMap
.
Джош Блох в Effective Java 2nd Edition идет дальше, чтобы объяснить, почему использование ordinal ()
- ужасная идея. Вот несколько цитат, слегка отредактированных:
Никогда не выводите значение, связанное с перечислением, из его порядкового номера; вместо этого сохраните его в поле экземпляра. ( Правило 31: Используйте поля экземпляра вместо порядковых ) Редко бывает уместно использовать порядковые номера для индексирования массивов: вместо этого используйте
EnumMap
. Общий принцип состоит в том, что прикладные программисты должны редко, если вообще когда-либо, использоватьEnum.ordinal
. ( Правило 33: ИспользуйтеEnumMap
вместо порядкового индекса )
Ваш "странный и долгий" путь в точности соответствует предписанию пункта 31.
К счастью , Java не является C. Перечисление Java
очень мощное и гибкое, поддерживается многими классами библиотек, и вам следует научиться использовать их вместо использования ordinal ()
.
Взгляните, например, на EnumMap
.
Специализированная реализация
Map
для использования с ключами типаenum
.Все ключи в картеenum
должны происходить из одного типаenum
, который указывается явно или неявно при создании карты. Карты Enum представлены внутри как массивы. Это представление чрезвычайно компактно и эффективно.
То есть вместо следующего (что, возможно, именно то, что вы хотели сделать):
T[] arr = ...;
TK tk = ...;
T something = ...;
arr[tk.ordinal()] = something;
Вместо этого вы можете сделать:
Map<TK,T> map = new EnumMap<TK,T>(TK.class);
TK tk = ...;
T something = ...;
map.put(tk, something);
В книге также рассматривается другое «традиционное» (ab) использование enum
в C, т.е. битовые поля (присвоение степени 2 каждой константе и т. Д.). Для этого в Java есть EnumSet
.
http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal ()
public final int ordinal ()
Возвращает порядковый номер этой константы перечисления (ее положение в объявлении перечисления, где начальной константе присваивается порядковый номер ноль). Большинству программистов этот метод не пригодится. Он разработан для использования в сложных структурах данных на основе перечислений, таких как EnumSet и EnumMap.
tk.ordinal()
- это способ сделать это, где tk
- это экземпляр TK
http://java.sun.com/javase/6/docs/api/index.html? java / lang / Enum.html # ordinal ()