ordinal()
方法返回一个枚举实例的序号。我怎样才能为一个枚举设置序号?
你可以通过改变枚举的顺序来控制序数,但是不能像在 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
。实际上,您不应该需要它。 如果您想要一些整数属性,请定义一个。返回此枚举常量的序数(其在其枚举声明中的位置,其中初始常量分配为零)。 大多数程序员将不需要使用此方法。 它专为复杂的基于枚举的数据结构(例如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 monthOfYear) {
this.monthOfYear = monthOfYear;
}
private int monthOfYear;
public int asMonthOfYear() {
return monthOfYear;
}
}
注意: 默认情况下,如果您不指定值,枚举
值将从 0
开始(而不是 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。
返回值:此枚举常量的序数
如果你有
public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }
那么SUNDAY的序数为0,MONDAY为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语句? - techfly