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


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

7 62

7 ответов:

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

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

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

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

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

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

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

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 для каждого элемента.

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

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

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

Если у вас

общественный день перечисления { ВОСКРЕСЕНЬЕ, ПОНЕДЕЛЬНИК, ВТОРНИК, СРЕДА, ЧЕТВЕРГ, ПЯТНИЦА, СУББОТА }

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

Проверьте Java перечисление примеров и docs

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

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

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

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