Mat*_*att 83
您可以通过更改枚举的顺序来控制序号,但不能像在中那样明确地设置它C++.一种解决方法是在枚举中为您想要的数字提供额外的方法:
enum Foo {
BAR(3),
BAZ(5);
private final int val;
private Foo(int v) { val = v; }
public int getVal() { return val; }
}
Run Code Online (Sandbox Code Playgroud)
BAR.ordinal() == 0但在这种情况下BAR.getVal() == 3.
Boz*_*zho 62
你不能设置它.它始终是常量定义的序数.请参阅Enum.ordinal()的文档:
返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零).大多数程序员都没有使用这种方法.它设计用于复杂的基于枚举的数据结构,例如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;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:默认情况下,如果您不指定值,则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);
}
}
Run Code Online (Sandbox Code Playgroud)