该ordinal()
方法返回枚举实例的序数。
如何设置枚举的序数?
Answers:
您无法设定。它始终是常量定义的序数。请参阅Enum.ordinal()的文档:
返回此枚举常量的序数(其在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都不会使用此方法。它设计用于复杂的基于枚举的数据结构,例如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
。
正如公认的答案指出的那样,您无法设置序数。最接近此功能的是自定义属性:
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
(not 1
)。同样,1
对于每个项目,值都不必增加。
您可以使用反射来更新序数:
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()返回此枚举常量的序数(其在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都不会使用此方法。它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。
返回:此枚举常量的序数
如果你有
公共枚举日{{星期日,星期一,星期二,星期三,星期四,星期四,星期五,星期六}
那么SUNDAY的序数为0,MONDAY为1,依此类推...
简单的答案:只需更改常数的顺序即可。第一个定义为0,第二个定义为1,依此类推。但是,如果您不断更改代码,或者枚举会包含许多值,那么这可能不切实际。您可以定义一个自定义方法来解决默认序数问题,但是请确保对此进行了详细记录以避免混淆!
public enum Values
{
ONE, TWO, THREE, FOUR;
public int getCustomOrdinal()
{
if(this == ONE)
{
return 3;
}
else if(this == TWO)
{
return 0;
}
...
}
}
ONE(3)
,TWO(0)
等等摆脱任何的if / else或switch语句?