ordinal()
方法返回枚举实例的序数
如何设置枚举的序数?
答案 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 examples和docs
返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。大多数程序员都没有使用这种方法。它设计用于复杂的基于枚举的数据结构,例如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;
}
...
}
}