如何将枚举值转换为int?


240

我有一个返回int类型的函数。但是,我只有TAX枚举的值。

如何将TAX枚举值转换为整数?

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;
}

1
可能的重复如何匹配的int枚举
马拉特

Answers:


354

您需要使枚举value以某种方式公开,例如

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();
}

(顺便说一句,我将名称更改为更常规和易读。)

这是假设你想在构造函数中指定的值。如果这不是您想要的,则需要向我们提供更多信息。


1
@likejiujitsu:方向相反。在这个问题中,OP已经具有类型的值Tax,并希望从中获取数值。
乔恩·斯基特

我只是尝试了一下,然后意识到它失败myEnumValue = MyEnum.valueOf(myInt);了,arg必须是String类型的-还是我缺少什么?
likejudo 2014年

这个解决方案总比没有好。似乎不应该使用Java中的枚举?还是JDK 1.8改变了这一点?
ebyrob '16

@ebyrob:在投票之后,就像我一样,似乎很多人不同意你的看法。如果您需要一组固定的值,则枚举绝对可以。
Jon Skeet

209

我更喜欢这样:

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}

然后:

//cast enum to int
int color = Color.Blue.ordinal();

34
这是不正确的,也不是Joshua Bloch在他的《有效的Java》(第二版)中推荐的。见项目31
user504342

43
@ user504342我没有这本书的第二版,所以您能给我们为什么不推荐它的要点吗?
likejudo 2014年

17
原因有两个:一,如果添加新的常数,则序数值与常数之间的任何关联都会中断,并且两个API文档特别建议不要这样做。
jordanpg

8
如此干净和完美。我看到一些“不做”和“不推荐”的内容。我必须研究为什么它被认为是不好的。一些the肿的样品看起来很糟糕,IMO。做这么简单的任务需要做很多工作。
香草米汉

4
在团队中,您非常确定自己的共同开发人员会在中间添加一个值(一开始就更糟),或者只是对它们进行排序,因为它们无关紧要,并且使用它们完全弄乱了代码.ordinal()
Michael Laffargue

18

如果要在构造函数中分配值,则需要在枚举定义中添加一个方法以返回该值。

如果您想要一个代表枚举值的唯一数字,则可以使用ordinal()


2
小心。ordinal()比的有效用例要依赖的开发反模式更多ordinal()。如果您需要存储的唯一值enum,则只需存储即可enum。有EnumSets,Enums列表,EnumMaps以及您可能希望使用的几乎所有其他Enum集合。
Edwin Buck

1
@EdwinBuck:指出这一点很好,我只是想提到它的存在,ordinal()因为OP并没有明确说明他想要int实际是什么。
unholysampler 2011年

不要顺序。请检查有关此的枚举api。上投票已删除。
气垫船充满鳗鱼,

3
我想知道人们ordinal()对于枚举本身内部使用的想法是什么。例如,假设我有一个名为“枚举Season”,其中包含的值SpringSummerAutumn,和Winter,它有一个名为公共方法next()返回values()[(ordinal() + 1) % 4] 从外部看,没有代码以往任何时候都看到序数,并且永远不会有这个枚举的其他成员,因此,这似乎是一个有效的用例。
Darrel Hoffman

1
@DarrelHoffman我的感觉是这样做很好,因为我看到的唯一反对ordinal()在远距离代码上使用铰链的强论据被枚举枚举常量的更改所破坏。如果要修改枚举的常量,则必须已经在该文件中。大多数枚举都很短,如果不是,则无论如何都应该更彻底地检查文件。在两种情况下,您可能都应该进行单元测试以覆盖您的next()方法。
艾伦·亨斯利

12

有时,某些C#方法会使Java世界的生活变得更轻松。

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(代码清晰)的好处,enum是DB友好的数据类型,我不必研究100个enum替代方案即可以“ android方式”进行操作。简单有效。
约翰·沃德

真好 就像Java枚举完全脱离了枚举用于的现实...尤其是如果人们随后开始滥用单例之类的东西时。这种方法确实具有缺点,尽管它没有一种简单的方法来获取所有值。
Nyerguds

这不是试图将枚举值传递给方法的缺点吗?您不能再将XLINK传递给方法,因为它不代表任何具体含义。您将无法输入方法。方法签名必须简短阅读,而不是XLINK。
达斯汀·詹森

2

也许使用String表示比使用整数更好,因为如果将值添加到枚举,则String仍然有效。您可以使用枚举的name()方法将枚举值转换为String,并使用枚举的valueOf()方法再次从String创建枚举表示形式。下面的示例演示如何将枚举值转换为String并返回(ValueType是枚举):

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
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.
}

0

一种不同的方法(至少在Android上是这样)是使用IntDef批注组合一组int常量

@IntDef({NOTAX, SALESTAX, IMPORTEDTAX})
@interface TAX {}
int NOTAX = 0;
int SALESTAX = 10;
int IMPORTEDTAX = 5;

用作函数参数:

void computeTax(@TAX int taxPercentage){...} 

或在变量声明中:

@TAX int currentTax = IMPORTEDTAX;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.