Есть ли C-подобный способ получить номер элемента из enum в java?

Похоже, это простой базовый вопрос

Наличие 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 макросы .. Я скучаю по вам обоим)

спасибо

8
задан Hernán Eche 4 May 2010 в 13:29
поделиться

5 ответов

Вы ищете порядковый?

7
ответ дан 5 December 2019 в 06:22
поделиться

порядковый номер () делает то, что вы хотите делать. Это отрывок из документации:

Возвращает порядковый номер этой константы перечисления (ее положение в объявлении 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 .

14
ответ дан 5 December 2019 в 06:22
поделиться

http://java.sun.com/javase/6/docs/api/java/lang/Enum.html#ordinal ()

public final int ordinal ()
Возвращает порядковый номер этой константы перечисления (ее положение в объявлении перечисления, где начальной константе присваивается порядковый номер ноль). Большинству программистов этот метод не пригодится. Он разработан для использования в сложных структурах данных на основе перечислений, таких как EnumSet и EnumMap.

1
ответ дан 5 December 2019 в 06:22
поделиться
tk.ordinal()

- это способ сделать это, где tk - это экземпляр TK

http://java.sun.com/javase/6/docs/api/index.html? java / lang / Enum.html # ordinal ()

2
ответ дан 5 December 2019 в 06:22
поделиться

Вы можете использовать ordinal()

2
ответ дан 5 December 2019 в 06:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: