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

Kea*_*ang 66 java enums

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

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.

  • 除此之外的+1不是解决方法,真的.这是理想的行为.序数值被认为是实现工件; 如果你想分配一个整数或其他值,那就是"enums is clases"是如此之大...... (9认同)

Boz*_*zho 62

你不能设置它.它始终是常量定义的序数.请参阅Enum.ordinal()文档:

返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零).大多数程序员都没有使用这种方法.它设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap.

实际上 - 你不应该这样做.如果需要某个整数属性,请定义一个.

  • 如果我可以指定enum的序数,当使用带有枚举的JPA时,那将更安全...... (5认同)

blu*_*ubb 7

正如接受的答案所指出的那样,您无法设置序数。最接近此的是使用自定义属性

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每个项目的值不必递增。


Sll*_*ort 5

您可以使用反射更新序数:

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)

  • 如果您愿意这样做,您不妨重新排序枚举字段。它更容易、更安全、更易读。 (2认同)