Могу ли я указать порядковый номер для enum в Java? - PullRequest
63 голосов
/ 21 марта 2011

Метод ordinal() возвращает порядковый номер экземпляра перечисления.
Как установить порядковый номер для перечисления?

Ответы [ 7 ]

82 голосов
/ 21 марта 2011

Вы можете управлять порядковым номером, изменяя порядок перечисления, но вы не можете установить его явно, как в C++.Одним из обходных путей является предоставление дополнительного метода в вашем перечислении для нужного числа:

enum Foo {
  BAR(3),
  BAZ(5);
  private final int val;
  private Foo(int v) { val = v; }
  public int getVal() { return val; }
}

В этой ситуации BAR.ordinal() == 0, но BAR.getVal() == 3.

62 голосов
/ 21 марта 2011

Вы не можете установить его.Это всегда порядковый номер постоянного определения.См. Документацию для Enum.ordinal () :

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

А на самом деле - не нужно.Если вам нужно какое-то целочисленное свойство, определите его.

4 голосов
/ 17 сентября 2014

Вы можете обновить порядковый номер, используя отражение:

private void setEnumOrdinal(Enum object, int ordinal) {
    Field field;
    try {
        field = object.getClass().getSuperclass().getDeclaredField("ordinal");
        field.setAccessible(true);
        field.set(object, ordinal);
    } catch (Exception ex) {
        throw new RuntimeException("Can't update enum ordinal: " + ex);
    }
}
3 голосов
/ 27 октября 2017

Как показывает принятый ответ, вы не можете установить порядковый номер.Самое близкое к этому можно получить с помощью пользовательского свойства :

public enum MonthEnum {

    JANUARY(1),
    FEBRUARY(2),
    MARCH(3),
    APRIL(4),
    MAY(5),
    JUNE(6),
    JULY(7),
    AUGUST(8),
    SEPTEMBER(9),
    OCTOBER(10),
    NOVEMBER(11),
    DECEMBER(12);

    MonthEnum(int monthOfYear) {
        this.monthOfYear = monthOfYear;
    }

    private int monthOfYear;

    public int asMonthOfYear() {
        return monthOfYear;
    }

}

Примечание : по умолчанию значения enum начинаются с 0 (не1) если вы не указали значения.Кроме того, значения не должны увеличиваться на 1 для каждого элемента.

2 голосов
/ 21 марта 2011

С http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html

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

Возвращает: порядковый номер этой константы перечисления

Если у вас есть

public enum Day {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, СУББОТА}

тогда воскресенье имеет порядковый номер 0, понедельник равен 1 и т. Д. ...

0 голосов
/ 21 марта 2011

Простой ответ: просто измените порядок констант.Первым определенным будет 0, вторым - 1 и т. Д. Однако это может оказаться непрактичным, если вы постоянно меняете код или перечисления будут иметь множество значений.Вы можете определить собственный метод для работы с порядковым номером по умолчанию, но УБЕДИТЕСЬ, что он хорошо документирован, чтобы избежать путаницы!

public enum Values
{
    ONE, TWO, THREE, FOUR;

    public int getCustomOrdinal()
    {
        if(this == ONE)
        {
            return 3;
        }
        else if(this == TWO)
        {
            return 0;
        }
        ...
    }
}
0 голосов
/ 21 марта 2011

Ознакомьтесь с примерами Java Enum и docs

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...