Java枚举类型中是否有一种方式可以使其元素具有“缺失”的整数值?

4
例如,我有一个枚举中的两个元素。我希望第一个元素用整数值0和字符串A表示,但是第二个元素用整数值2和字符串“B”表示(而不是1)。这可能吗?
目前,我的枚举声明如下:
public enum Constants {
    ZERO("Zero");
    TWO("Two");
}

如果我获取ZERO和TWO的整数值,目前会分别得到0和1。然而,我希望得到0和2。
4个回答

14

我猜你是指让枚举的序数返回用户定义的值的方法。如果是这样,答案是否定的。

如果你想返回一个特定的值,可以在枚举构造函数中实现(例如getValue()),并将其传入其中。

例如:

public enum Constants {
    ZERO("Zero",0),
    TWO("Two",2);

    final private String label;
    final private int value;

    Constants(String label, int value) {
        this.label = label;
        this.value= value;
    }

    public int getValue() {
        return value;
    }

    public String getLabel() {
        return label;
    }
}

从JavaDocs中: "返回此枚举常量的序数(它在其枚举声明中的位置,其中初始常量被分配为零的序数)"。它们确实编号为0-元素数量。 - amischiefr
然而,通过不使用ordinal()方法并将值传递给构造函数,我可以隐藏真实的序数值不让用户看到,并使用任何我想要的值。 - Thomas Owens
你应该将标签和值声明为final。 - Steve Kuo

4

为您的枚举定义一个适当命名的整数字段,并将其初始化为最合适的值。枚举的内部序数不应承载任何含义。


3
尝试像这样做:

尝试像这样做:

public enum MyEnum {

A(1), B(2), C(3);

int myOrdinal;

private MyEnum(int myOrdinal) {
    this.myOrdinal = myOrdinal;
}

public int getMyOrdinal() {
    return myOrdinal;
}

如果您依赖枚举的内部编号,则顺序很重要,即使不同的jvm可能会以不同的方式处理它,这将导致不可预测的行为(除非在“enum jsr-161”中指定,我还没有读过...)。
我看到过一个依赖内部序数的实现,它被用于Web下拉框中的排序。一旦有人友好地“清理”枚举值,就会产生有趣的错误。

1

如果你想在构造函数中传递一个整数,那么可以使用以下代码:

String input = ...
int inputAsInt = Constants.valueOf(input.toUpperCase()).getValue();

类似这样:

public enum Constants{
 ZERO(0),
 TWO(1);
 private final int value;
 public Numbers(int value){
  this.value = value;
 }

 public int getValue(){
  return this.value;
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接