Java Enum return Int
我在声明枚举时遇到问题。我要创建的是"downloadType"的枚举,其中有3种下载类型(音频、视频、音频和视频)。
我已经实现了以下代码:
1 2 3 4 5 6 7 8 | private enum DownloadType { AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); private final int value; private DownloadType(int value) { this.value = value; } } |
如果我这样使用它,这就可以了:
1 | DownloadType.AUDIO_AND_VIDEO.value; |
但是,我希望这样做,这样我就不必要求"价值"。我可能错了,但是这是Java中的几个类的工作方式,例如字体,例如设置字体样式,你使用:
1 | Font.PLAIN |
它返回一个int值,我们不使用:
1 |
font.plain不是枚举。它只是一个
如果您确实只需要一个
1 2 3 4 5 6 7 8 9 | public final class DownloadType { public static final int AUDIO = 0; public static final int VIDEO = 1; public static final int AUDIO_AND_VIDEO = 2; // If you have only static members and want to simulate a static // class in Java, then you can make the constructor private. private DownloadType() {} } |
顺便说一下,
1 | enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO } |
并使用
1 | DownloadType.AUDIO_AND_VIDEO.ordinal() |
编辑:更正代码。在Java中不允许使用EDCOX1 8Ω。请参见下面的解释,并详细说明如何在Java中定义静态类。
如果需要获取int值,只需为枚举中的值准备一个getter:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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 } |
或者可以简单地使用
1 2 3 4 5 6 7 8 |
首先,你应该问自己以下问题:你真的需要一个int吗?
枚举的目的是拥有一组项(常量),这些项在代码中具有意义,而不依赖于外部值(如int)。Java中的Enums可以用作交换状态的参数,并且可以使用"= ="相等运算符(除其他之外)进行安全比较。
方案1(不需要利息):
通常不需要后面有整数,只需使用它:
1 2 3 | private enum DownloadType{ AUDIO, VIDEO, AUDIO_AND_VIDEO } |
用途:
1 2 3 4 5 6 7 8 9 10 11 12 13 | DownloadType downloadType = MyObj.getDownloadType(); if (downloadType == DownloadType.AUDIO) { //... } //or switch (downloadType) { case AUDIO: //... break; case VIDEO: //... break; case AUDIO_AND_VIDEO: //... break; } |
方案2(需要利息):
不过,有时将枚举转换为int可能很有用(例如,如果外部API需要int值)。在这种情况下,我建议使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | private enum DownloadType { AUDIO(2), VIDEO(5), AUDIO_AND_VIDEO(11); 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.toInt()); //returns 2 System.out.println(DownloadType.AUDIO); //returns 2 via `toString/code` System.out.println(DownloadType.AUDIO).ordinal(); //returns 0 System.out.println(DownloadType.AUDIO.name()); //returns AUDIO System.out.println(DownloadType.VIDEO.toInt()); //returns 5 System.out.println(DownloadType.VIDEO.ordinal()); //returns 1 System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 11 |
总结
- 如果不需要,则不要将整数与枚举一起使用。
- 不要依赖于使用
ordinal() 获取枚举的整数,因为如果更改顺序(例如插入值),此值可能会更改。如果您考虑使用ordinal() ,最好使用提案1。 - 通常不要使用in t常量而不是枚举(就像在接受的答案中一样),因为这样会降低类型安全性。
只需对枚举值调用
你不应该只依赖于一个
对于您在问题中提供的示例,
您可以尝试此代码。
1 2 3 4 | private enum DownloadType { AUDIO , VIDEO , AUDIO_AND_VIDEO ; } |
您可以这样使用这个枚举:
是否要此代码?
1 2 3 4 5 6 7 8 | 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()); } |
如果用字符串连接枚举,则可以重写ToString方法返回INT:
1 2 3 |
那么你可以简单地使用:
1 |
将调用toStrug()方法。
< BR>请注意,使用ToStRun()编程通常被认为是很差的实践-它只针对人眼,但是这是实现你所要求的唯一方法。