0

这应该是完全显而易见的,但事实并非如此。有没有办法获得枚举的值,如下例所示?

例子:

    public enum Numbers
    {
        zero, one, two

    }

//later on
Numbers numbers = Numbers.zero;
// this is the part that I can not figure out the java equivalent of?
int number = numbers.value();

这对我想要做的事情有意义吗?

4

4 回答 4

5

ordinal由于它基于enum常量的顺序,因此通常被认为是不好的做法。更好的解决方案是将信息传递给每个实例。只需像这样编写一个构造函数和方法:

public enum Number {
    ZERO(0), ONE(1), TWO(2);

    private int value;

    private Number(int value) {
        this.value = value;
    }

    public int value() {
        return value;
    }
};

然后你随心所欲地使用它

Number numbers = Number.ZERO;
int number = numbers.value();

Number如果您稍后添加 s ,您将不必担心代码的实际顺序。

注意:在 Java 中,enum名称为单数且常量为大写是惯用的。

于 2013-05-22T17:57:27.250 回答
3

根据您的评论,您似乎需要将一个整数值映射到您的enum以将其集成到代码的另一部分中。

而不是依赖于您真正想自己执行此操作的顺序:

public enum MyEnum {
    ZERO(0), ONE(1), TWO(2);

    private int mapping;

    MyEnum(int mapping) {
        this.mapping = mapping;
    }

    public int getMapping() {
        return mapping;
    }

} 

然后,您可以通过以下方式进行比较:

MyEnum e = MyEnum.ZERO;
if (someInt == e.getMapping()) { ... } 

(甚至只是MyEnum.ZERO.getMapping()

于 2013-05-22T17:58:48.177 回答
2

您可以使用该ordinal()方法。但是,这是不鼓励/有风险的,因为如果您更改枚举的顺序或安排,它将失败。例如,您更改为 2 的幂

public enum Numbers {
   zero, one, two, four
}

那么four.ordinal() 将是3。

如果你真的想要一个与枚举关联的数字,你应该定义你自己的方法,例如order()或其他。在最初的实现中,它可以返回ordinal(),但是,当您four将来添加时,您可以更新该方法。

ps 标准样式是将枚举大写,例如 ZERO、ONE 等...

于 2013-05-22T17:52:42.683 回答
1

这取决于你需要什么。这里有 2 个用例:

1)您可能需要测试传入“数字”的值。对于这个用例,开关盒是最好的解决方案。

void myMethod(Numbers n){

  switch(n){
    case zero:
    //do something
    break;

    case one:
    //do something
    break;

    //etc.
  }
}

2)您还可以需要为每个数字分配一个值并能够检索它。对于这个用例,您可以为您的枚举定义一个构造函数

public enum Numbers
{
    zero(0), one(1), two(2);

    private int value;

    private Numbers(int value){
      this.value=value;
    }

}

然后,在您的代码中,您可以获得此值:

void myMethod(Numbers n){
  int value = n.getValue();
  //do something with this value...
}

最后一句话:您的枚举名称不遵循 java 约定。它们应该用大写字母命名,最后用字符“_”命名。例如:一、二、三、ANOTHER_VALUE

于 2013-05-22T18:01:10.843 回答