如何将枚举值转换为int?

vrb*_*lgi 223 java enums

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

如何将TAX枚举值转换为int?

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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 333

你需要以value某种方式使enum暴露,例如

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();
}
Run Code Online (Sandbox Code Playgroud)

(我已将名称更改为更传统和可读,顺便说一下.)

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


小智 197

我更喜欢这个:

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}
Run Code Online (Sandbox Code Playgroud)

然后:

//cast enum to int
int color = Color.Blue.ordinal();
Run Code Online (Sandbox Code Playgroud)

  • @ user504342我没有这本书的第2版所以你能否告诉我们为什么不推荐它? (36认同)
  • Joshua Bloch在他的"Effective Java"(第二版)一书中提出这是不正确/不推荐的.见项目31. (33认同)
  • 有两个原因:一,如果添加新的常量,序数值和常量之间的任何关联都将中断,并且两个API文档特别推荐它. (15认同)
  • 如此干净和完美.我看到一些"不要做"和"不推荐".我将不得不研究为什么它被认为是坏的.一些臃肿的样本看起来很糟糕IMO.做这么简单的任务需要做很多工作. (7认同)
  • 我喜欢 ordinal() 的 javadoc 所说的“大多数程序员不会使用此方法”。实际上,拥有一个唯一整数列表而不必自己分配它们通常是我使用枚举的主要原因。当添加新常量时,只要您在最后添加它们,它们就不会“中断”。如果您在与外部程序通信时使用它们并且不在外部程序中添加新值,那么无论如何它都会被破坏。在 C 语言中这样做已经有 20 年了,从来没有遇到过任何问题。另外,给出“不推荐”作为“为什么不推荐”的答案并不是一个原因:) (5认同)
  • 在一个团队中,你很确定你的共同开发人员会在中间添加一个值(在开始时更糟糕),或者只是因为他们无所事事而对它们进行排序,并使用`.ordinal()完全弄乱代码` (3认同)
  • 我不关心数字变化的后果,因为我将它们视为不透明的值,并且不会将它们记录到磁盘或在程序外传递它们。在我的情况下,对“.ordinal()”的任何其他批评是否适用? (2认同)

unh*_*ler 18

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

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

  • 我想知道人们的想法是关于在enum本身内部使用`ordinal()`.例如,假设我有一个名为"`Season`"的枚举,其中包含值"Spring","Summer","Autumn"和"Winter",它有一个名为`next()`的公共方法,它返回` values()[(ordinal()+ 1)%4]`在外部,没有代码可以看到序号,并且在这个枚举中永远不会有其他成员,因此它看起来像一个有效的用例. (3认同)
  • 小心.有许多依赖于`ordinal()`的开发反模式比`ordinal()`的有效用例更多.如果你需要为`enum`存储一个唯一值,那么只需存储`enum`.有EnumSets,枚举列表,EnumMaps,以及您可能想要的几乎任何其他Enum集合. (2认同)

小智 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;
Run Code Online (Sandbox Code Playgroud)

  • 这不是试图将枚举值传递给方法的缺点吗?您不能再将 XLINK 传递给方法,因为它不代表任何具体内容。您失去了对方法的输入。方法签名必须读取短而不是 XLINK。 (2认同)