How to convert enum value to int?
我有一个返回int类型的函数。但是,我只有一个税收枚举的值。
如何将纳税枚举值强制转换为int?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public enum TAX {
NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);
private int value;
private TAX(int value){
this.value = value;
}
}
TAX var = TAX.NOTAX; // This value will differ
public int getTaxValue()
{
// what do do here?
// return (int)var;
} |
您需要让枚举以某种方式公开value,例如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public enum Tax {
NONE(0), SALES(10), IMPORT(5);
private final int value;
private Tax(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
...
public int getTaxValue() {
Tax tax = Tax.NONE; // Or whatever
return tax.getValue();
} |
(顺便说一句,我把名字改得更传统、更易读。)
这是假设您希望在构造函数中分配值。如果这不是你想要的,你需要给我们更多的信息。
- 这里有个更好的主意stackoverflow.com/a/7996473/398348
- @像柔术:那是反方向的。在这个问题中,op已经有一个类型为Tax的值,并希望从中获得数值。
- 我只是试了一下,意识到它失败了,myEnumValue = MyEnum.valueOf(myInt);,arg必须是string类型的,还是我遗漏了什么?
- @李家秀:嗯,这和这个问题无关……
- 这个解决方案比什么都没有糟糕。Java中的枚举难道不应该被使用吗?或者JDK 1.8改变了这一点?
- @埃比罗布:考虑到投票,像我一样,很多人似乎不同意你的看法。如果您想要一组固定的值,那么枚举绝对可以。
我更喜欢这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public enum Color {
White,
Green,
Blue,
Purple,
Orange,
Red
} |
然后:
1 2
| //cast enum to int
int color = Color. Blue. ordinal(); |
- 这是不正确的/不推荐Joshua Bloch在他的书中有效Java(第二ED)。参见第31项。
- 不建议直接使用ordinal()方法。
- @用户504342我没有这本书的第二版,所以你能告诉我们为什么不推荐这本书吗?
- 2个原因:第一,如果添加新的常量,序数值和常量之间的任何关联都将中断,而API文档专门推荐的两个。
- 如此干净完美。我看到一些"不做"和"不推荐"。我得研究一下为什么它被认为是坏的。在我看来,有些膨胀的样本看起来很糟糕。要完成这样一个简单的任务需要做很多工作。
- 在一个团队中,你很确定你的合作开发人员会在中间增加一个值(在开始的时候更糟),或者只是对它们进行排序,因为它们没有什么可做的,并且使用.ordinal()完全弄乱了代码。
如果需要在构造函数中分配的值,则需要在枚举定义中添加一个方法以返回该值。
如果需要表示枚举值的唯一数字,可以使用ordinal()。
- 小心。依赖于ordinal()的开发反模式比依赖于ordinal()的有效用例更多。如果需要为enum存储唯一值,那么只需存储enum。有枚举、枚举列表、枚举,以及您可能需要的几乎所有其他枚举集合。
- @埃德温巴克:很好地指出,我只是想提一下ordinal()的存在,因为OP没有明确说明他想要int是什么。
- 不要按顺序排列。请检查与此相关的枚举API。取消投票。
- 我想知道人们对在枚举内部使用ordinal()有什么看法。例如,假设我有一个名为"Season"的枚举,它包含值Spring、Summer、Autumn和Winter,并且它有一个名为next()的公共方法,它从外部返回values()[(ordinal() + 1) % 4],没有代码可以看到序数,并且这个枚举中永远不会有额外的成员,所以看起来一个有效的用例。
- @达雷霍夫曼,我的感觉是这样做很好,因为我所看到的反对使用ordinal()的唯一有力论据,是因为对枚举枚举常量的更改破坏了广泛的代码。如果要修改枚举的常量,则必须已经在该文件中。大多数枚举都相当短,如果不是,您应该更彻底地检查文件。不管怎样,在这两种情况下,您都应该有一个覆盖next()方法的单元测试。
有时,一些C方法使Java世界中的生活变得更简单。
1 2 3 4 5
| class XLINK {
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104;
}
//Now is trivial to use it like a C# enum:
int rcv = XLINK.ACK; |
- 对我来说,这是最理想的方式。我得到了Enum(代码清晰性)的好处,它是一种数据库友好的数据类型,我不需要研究100个Enum备选方案来用"android方式"实现它。简单有效。
- 很好。就好像Java枚举完全脱离了EnUM使用的现实。尤其是当人们开始滥用它的时候。这种方法确实有缺点,但是它没有一种简单的方法来获取所有值。
- 这难道不具有尝试将枚举值传递给方法的缺点吗?您不能再将XLink传递给方法,因为它不代表任何具体的内容。你输了输入你的方法。方法签名必须是短的而不是XLink。
也许使用字符串表示比使用整数更好,因为如果将值添加到枚举中,字符串仍然有效。可以使用枚举的name()方法将枚举值转换为字符串;使用枚举的valueof()方法再次从字符串创建枚举表示形式。以下示例显示如何将枚举值转换为字符串并返回(valuetype是枚举):
1 2 3 4 5 6 7 8
| ValueType expected = ValueType. FLOAT;
String value = expected. name();
System. out. println("Name value:" + value );
ValueType actual = ValueType. valueOf(value );
if(expected. equals(actual )) System. out. println("Values are equal"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public enum Tax {
NONE (1), SALES (2), IMPORT(3);
private final int value ;
private Tax (int value ) {
this. value = value ;
}
public String toString () {
return Integer. toString(value );
}
}
class Test {
System. out. println(Tax. NONE); //Just an example.
} |