我可以在Java中为枚举指定序数吗?

时间:2011-03-21 01:07:33

标签: java enums

ordinal()方法返回枚举实例的序数 如何设置枚举的序数?

7 个答案:

答案 0 :(得分:81)

您可以通过更改枚举的顺序来控制序号,但不能像在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

答案 1 :(得分:62)

您无法设置它。它始终是常量定义的序数。请参阅documentation for Enum.ordinal()

  

返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。

实际上 - 你不应该这样做。如果你想要一些整数属性,请定义一个。

答案 2 :(得分: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);
    }
}

答案 3 :(得分:3)

正如接受的答案指出的那样,你无法设定序数。您最接近的是自定义属性

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

答案 4 :(得分:2)

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

  

public final int ordinal()返回此枚举常量的序号(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。

     

返回:   这个枚举常数的序数

如果你有

  

public enum Day {       星期日,星期一,星期二,星期三,       星期四,星期五,星期六   }

然后SUNDAY的序数为0,MONDAY为1,依此类推......

答案 5 :(得分:0)

查看Java Enum examplesdocs

  

返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。

答案 6 :(得分:-3)

答案很简单:只需更改常量的顺序即可。第一个定义为0,第二个定义为1等。但是,如果您不断更改代码,或者枚举将有许多值,这可能不实用。您可以定义一个自定义方法来解决默认序号,但请确保它有详细记录以避免混淆!

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

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