我可以在Java中为枚举指定序号吗?
ordinal()
方法返回一个枚举实例的序号。
我如何设置枚举的序号?
你不能设置它。 它始终是不变定义的序数。 请参阅Enum.ordinal()的文档 :
返回此枚举常量的序号(它在枚举声明中的位置,初始常量的赋值为0的序数)。 大多数程序员将无法使用这种方法。 它专门用于复杂的基于枚举的数据结构,如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
。
您可以使用reflection来更新序号:
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()返回此枚举常量的序号(在其枚举声明中的位置,初始常量的赋值为0的序数)。 大多数程序员将无法使用这种方法。 它专门用于复杂的基于枚举的数据结构,如EnumSet和EnumMap。
返回:这个枚举常量的序数
如果你有
公共枚举日{星期日,星期一,星期二,星期三,星期四,星期五,星期六}
那么SUNDAY有0的序数,MONDAY是1,依此类推…
查看Java Enum示例和文档
返回此枚举常量的序号(它在枚举声明中的位置,初始常量的赋值为0的序数)。 大多数程序员将无法使用这种方法。 它专门用于复杂的基于枚举的数据结构,如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 number) { this.number = number; } private int number; public int asNumber() { return number; } }
简单的答案:只是改变常量的顺序。 第一个定义为0,第二个定义为1等等。但是,如果你不断地改变代码,这可能是不实际的,或者枚举会有许多值。 您可以定义一个自定义方法来解决默认序号,但请确认它是有据可查的,以避免混淆!
public enum Values { ONE, TWO, THREE, FOUR; public int getCustomOrdinal() { if(this == ONE) { return 3; } else if(this == TWO) { return 0; } ... } }