这应该是完全明显的,但事实并非如此。有没有办法获得枚举的值,如下例所示?
示例:
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();
这是否有意义我想做什么?
答案 0 :(得分: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
,则无需担心代码的实际顺序。
注意:在Java中,enum
名称是单数的,而常量是大写的,这是惯用的。
答案 1 :(得分: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()
)
答案 2 :(得分:2)
您可以使用ordinal()
方法。但是,这是气馁/冒险,因为如果您更改了枚举的顺序或安排,它将失败。例如,你改为两个人的权力
public enum Numbers {
zero, one, two, four
}
然后four.ordinal()将是3。
如果你真的想要一个与枚举相关联的数字,你应该定义自己的方法,例如: order()
或其他什么。在初始实现中,它可以返回ordinal()
,但是,当您将来添加four
时,您可以更新该方法。
P.S。标准样式是将枚举大写,例如ZERO,ONE等...
答案 3 :(得分: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惯例。它们应该用大写字母命名,最后用字符'_'命名。例如:一,二,三,另一种