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开始分配,每个值按照它们声明的顺序递增。
你不应该依赖enum
的int
值,只能依赖于它的实际值。 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()); }