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

ordinal()方法返回一个枚举实例的序号。
我如何设置枚举的序号?

你不能设置它。 它始终是不变定义的序数。 请参阅Enum.ordinal()的文档 :

返回此枚举常量的序号(它在枚举声明中的位置,初始常量的赋值为0的序数)。 大多数程序员将无法使用这种方法。 它专门用于复杂的基于枚举的数据结构,如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

您可以使用reflection来更新序号:

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

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

public final int ordinal()返回此枚举常量的序号(在其枚举声明中的位置,初始常量的赋值为0的序数)。 大多数程序员将无法使用这种方法。 它专门用于复杂的基于枚举的数据结构,如EnumSet和EnumMap。

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

如果你有

公共枚举日{星期日,星期一,星期二,星期三,星期四,星期五,星期六}

那么SUNDAY有0的序数,MONDAY是1,依此类推…

查看Java Enum示例和文档

返回此枚举常量的序号(它在枚举声明中的位置,初始常量的赋值为0的序数)。 大多数程序员将无法使用这种方法。 它专门用于复杂的基于枚举的数据结构,如EnumSet和EnumMap。

正如接受的答案指出,你不能设置序数。 最近你可以得到这是一个自定义属性

 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 number) { this.number = number; } private int number; public int asNumber() { return number; } } 

简单的答案:只是改变常量的顺序。 第一个定义为0,第二个定义为1等等。但是,如果你不断地改变代码,这可能是不实际的,或者枚举会有许多值。 您可以定义一个自定义方法来解决默认序号,但请确认它是有据可查的,以避免混淆!

 public enum Values { ONE, TWO, THREE, FOUR; public int getCustomOrdinal() { if(this == ONE) { return 3; } else if(this == TWO) { return 0; } ... } }