2011-03-21 2 views

ответ

58

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

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

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

+5

Если я могу указать порядковый номер перечисления, когда использовать JPA с перечислением, который будет более безопасным ... –

75

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

+7

+1 кроме этого ISN На самом деле это обходной путь. это желаемое поведение. порядковое значение считается артефактом реализации; если вы хотите назначить целое или другое значение, это то, что «перечисления являются кланами» настолько велики ... – andersoj

+1

would not BAR.ordinal() return 0 индексы afaik enum основаны на нуле – Terraego

+0

@Terraego Хороший улов. – Matt

2

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

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

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

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

день общественное перечисление { воскресенье, понедельник, вторник, среда, Четверга, Пятницы, Субботы }

then SUNDAY имеет порядковый номер 0, ПОНЕДЕЛЬНИК 1, и так далее ...

+3

ortinal не гарантирует получение заказа по которому выше! – claj

+1

@claj, можете ли вы немного расшириться? Как представляется, документация указывает на это. – Celos

+0

Извините @Celos, первое перечисление действительно 0, но спецификация не упоминает, как значение должно быть назначено вообще, кроме монотонно возрастающего. Я думаю, что я кое-что прочитал об этом предостережении в Эффективной Java или так, но не задумываюсь об этом. – claj

0

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

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

-2

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

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

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

+1: Оператор switch может быть лучше, чем ряд операторов if-else. –

+4

Мне не нравится это решение. Перечисления являются классами и поэтому могут содержать пользовательские свойства. Я бы предпочел правильно определить поле для этого и соответствующий метод getter. – Atmocreations

+0

Это лучшее решение в целом. Но вопрос спросил, можно ли изменить поведение порядка (0 ... – donnyton

4

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

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

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

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

} 
Смежные вопросы