ordinal()方法返回枚举实例的序号。 如何设置枚举的序号?
ordinal()
你不能设置它。它总是常量定义的序数。参见 Enum.ordinal ()的文档:
返回此枚举常数的序数(它在其枚举声明中的位置,其中初始常数被赋予零的序数)。大多数程序员不会使用这种方法。它被设计用于复杂的基于枚举的数据结构,如 EnumSet 和 EnumMap。
实际上-你不应该需要。如果你想要一些整数属性,定义一个。
您可以通过更改枚举的顺序来控制序号,但是不能像在 C++中那样显式地设置它。一个变通方法是在枚举中为所需的数字提供一个额外的方法:
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。
BAR.ordinal() == 0
BAR.getVal() == 3
来自 http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html
Public final int ordinal ()返回此枚举常数的序数(它在其枚举声明中的位置,其中初始常数被赋予一个零的序数)。大多数程序员不会使用这种方法。它被设计用于复杂的基于枚举的数据结构,如 EnumSet 和 EnumMap。 返回: 此枚举常数的序数
Public final int ordinal ()返回此枚举常数的序数(它在其枚举声明中的位置,其中初始常数被赋予一个零的序数)。大多数程序员不会使用这种方法。它被设计用于复杂的基于枚举的数据结构,如 EnumSet 和 EnumMap。
返回: 此枚举常数的序数
如果你有的话
公开枚举日{ 星期天,星期一,星期二,星期三, 星期四,星期五,星期六 }
那么 SUNDAY 的序数是0,MONDAY 的序数是1,以此类推..。
查看 Java枚举示例和 医生
简单的答案是: 改变常量的顺序。第一个定义为0,第二个定义为1,等等。但是,如果您不断地更改代码,或者枚举会有许多值,那么这可能是不实际的。您可以定义一个自定义的方法来围绕默认的顺序工作,但请确保它是很好的文档,以避免混淆!
public enum Values { ONE, TWO, THREE, FOUR; public int getCustomOrdinal() { if(this == ONE) { return 3; } else if(this == TWO) { return 0; } ... } }
您可以使用反射更新序数:
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递增。
enum
0
1