Java Enum return Int

我无法声明一个枚举。 我试图创build一个“DownloadType”的枚举,其中有3种下载types(AUDIO,VIDEO,AUDIO_AND_VIDEO)。

我已经执行的代码如下:

private enum DownloadType { AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); private final int value; private DownloadType(int value) { this.value = value; } } 

这工作正常,如果我然后像这样使用它:

 DownloadType.AUDIO_AND_VIDEO.value; 

不过,我想这样做,我不必要求“价值”。 我可能会误解,但这是几个类在Java中工作的方式,如Font,例如设置字体样式,您可以使用:

 Font.PLAIN 

其中返回一个int值,我们不使用:

 Font.PLAIN.value 

Font.PLAIN 不是枚举。 这只是一个int 。 如果您需要从枚举中取出值,则无法避免调用方法或使用.value ,因为枚举实际上是它自己types的对象,而不是基元。

如果你真的只需要一个int并且你已经接受这个types安全性丢失了,那么用户可能会将无效值传递给你的API,你可以把这些常量定义为int

 static class DownloadType { public static final int AUDIO = 0; public static final int VIDEO = 1; public static final int AUDIO_AND_VIDEO = 2; } 

顺便说一句, value字段实际上是多余的,因为还有一个.ordinal()方法,所以你可以定义enum为:

 enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO } 

并获得“价值”使用

 DownloadType.AUDIO_AND_VIDEO.ordinal() 

如果你需要得到int值,只需要在你的ENUM中有一个getter的值:

 private enum DownloadType { AUDIO(1), VIDEO(2), AUDIO_AND_VIDEO(3); private final int value; private DownloadType(int value) { this.value = value; } public int getValue() { return value; } } public static void main(String[] args) { System.out.println(DownloadType.AUDIO.getValue()); //returns 1 System.out.println(DownloadType.VIDEO.getValue()); //returns 2 System.out.println(DownloadType.AUDIO_AND_VIDEO.getValue()); //returns 3 } 

或者你可以简单地使用ordinal()方法,它将返回枚举中的枚举常量的位置。

 private enum DownloadType { AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); //rest of the code } System.out.println(DownloadType.AUDIO.ordinal()); //returns 0 System.out.println(DownloadType.VIDEO.ordinal()); //returns 1 System.out.println(DownloadType.AUDIO_AND_VIDEO.ordinal()); //returns 2 

首先,你应该问自己以下问题: 你真的需要一个int吗?

枚举的目的是有一个项目(常量)的集合,在代码中有一个含义,而不依赖于外部值(如int)。 Java中的枚举可以用作开关语句的参数,可以使用“==”等号运算符(等等)安全地进行比较。

build议1(不需要int):

通常不需要它后面的整数。

 private enum DownloadType{ AUDIO, VIDEO, AUDIO_AND_VIDEO } //... DownloadType downloadType = MyObj.getDownloadType(); if (downloadType == DownloadType.AUDIO) { //... } //or switch (downloadType) { case AUDIO: //... break; case VIDEO: //... break; case AUDIO_AND_VIDEO: //... break; } 

build议2(int需要):

尽pipe如此,有时将枚举转换为int也是有用的(例如,如果外部API需要int值)。 在这种情况下,我build议将方法标记为使用toXxx() Style的转换方法。 用于打印覆盖toString()

 private enum DownloadType { AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); private final int code; private DownloadType(int code) { this.code = code; } public int toInt() { return code; } public String toString() { //only override toString, if the returned value has a meaning for the //human viewing this value return String.valueOf(code); } } System.out.println(DownloadType.AUDIO); //returns 0 System.out.println(DownloadType.AUDIO.name()); //returns AUDIO System.out.println(DownloadType.VIDEO.toInt()); //returns 1 System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 2 

概要

  • 如果不需要,不要使用Integer和枚举。
  • 不要依赖于使用ordinal()来得到一个枚举整数,因为如果你添加一个其他的枚举常量或改变顺序,这个值可能会改变。
  • 通常不要使用int常量而不是枚举(就像在接受的答案中一样),因为你会失去types安全(就像@KennyTM提到的那样)。

只需在枚举值上调用ordinal()方法,就可以检索相应的数字。 没有必要使用它的值声明一个添加属性,每个枚举值默认都会得到自己的数字,从0开始分配,每个值按照它们声明的顺序递增。

你不应该依赖enumint值,只能依赖于它的实际值。 Java中的枚举是一种不同types的怪物,并不像C中的枚举,因为它依赖于它们的整数代码。

关于您在问题中提供的示例, Font.PLAIN可以工作,因为这只是Font类的整数常量。 如果你绝对需要(可能改变)数字代码,那么enum不是正确的工具,更好地坚持数字常量。

如果你用一个string连接枚举,你可以重写toString方法来返回int:

 public String toString() { return value + ""; } 

那么你可以简单地使用:

 String something = "foo" + DownloadType.AUDIO; 

并且toString()方法将被调用。

请注意,以编程方式使用toString()通常被认为是不好的练习 – 它只适用于人眼,但这是实现你所要求的唯一方法。

你可以试试这个代码。

 private enum DownloadType { AUDIO , VIDEO , AUDIO_AND_VIDEO ; } 

你可以像这样使用这个枚举: DownloadType.AUDIO.ordinal() 。 希望这个代码片段将帮助你。

你想要这个代码吗?

 public static enum FieldIndex { HDB_TRX_ID, //TRX ID HDB_SYS_ID //SYSTEM ID } public String print(ArrayList<String> itemName){ return itemName.get(FieldIndex.HDB_TRX_ID.ordinal()); }