我可以在 Java 中为枚举指定序数吗?

ordinal()方法返回枚举实例的序号。
如何设置枚举的序号?

105261 次浏览

你不能设置它。它总是常量定义的序数。参见 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

来自 http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Enum.html

Public final int ordinal ()返回此枚举常数的序数(它在其枚举声明中的位置,其中初始常数被赋予一个零的序数)。大多数程序员不会使用这种方法。它被设计用于复杂的基于枚举的数据结构,如 EnumSet 和 EnumMap。

返回: 此枚举常数的序数

如果你有的话

公开枚举日{ 星期天,星期一,星期二,星期三, 星期四,星期五,星期六 }

那么 SUNDAY 的序数是0,MONDAY 的序数是1,以此类推..。

查看 Java枚举示例医生

返回此枚举常数的序数(它在其枚举声明中的位置,其中初始常数被赋予零的序数)。大多数程序员不会使用这种方法。它被设计用于复杂的基于枚举的数据结构,如 EnumSet 和 EnumMap。

简单的答案是: 改变常量的顺序。第一个定义为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递增。