Могу ли я указать порядковый номер для перечисления в Java?
на ordinal()
метод возвращает порядковый номер экземпляра перечисления.
Как я могу установить порядковый номер для перечисления?
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; } ... } }