Могу ли я указать порядковый номер для перечисления в Java?

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

Ответ 1

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

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

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

Ответ 2

Вы можете управлять порядком, изменяя порядок перечисления, но вы не можете его явно указать в 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.

Ответ 3

Вы можете обновить порядковый номер с помощью отражения:

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);
    }
}

Ответ 4

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

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

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

Если у вас

public enum День {     ВОСКРЕСЕНЬЕ, ПОНЕДЕЛЬНИК, ВТОРНИК, СРЕДА,     ЧЕТВЕРГ, ПЯТНИЦА, СУББОТА }

то SUNDAY имеет порядковый номер 0, MONDAY равен 1 и так далее...

Ответ 5

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

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;
    }

}

Ответ 6

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

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

Ответ 7

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

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

    public int getCustomOrdinal()
    {
        if(this == ONE)
        {
            return 3;
        }
        else if(this == TWO)
        {
            return 0;
        }
        ...
    }
}