Java Enum返回Int

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


font.plain不是枚举。它只是一个int。如果需要从枚举中提取值,就不能避免调用方法或使用.value,因为枚举实际上是它自己类型的对象,而不是原语。

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

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

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

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
}

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

1
2
3
4
5
6
7
8
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中的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值)。在这种情况下,我建议使用toXxx()样式将这些方法标记为转换方法。用于打印覆盖toString()

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常量而不是枚举(就像在接受的答案中一样),因为这样会降低类型安全性。


只需对枚举值调用ordinal()方法,即可检索其对应的编号。不需要用其值声明一个addition属性,默认情况下,每个枚举值都有自己的编号,从零开始分配,按照声明的顺序为每个值递增一个。

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

对于您在问题中提供的示例,Font.PLAIN起作用,因为它只是字体类的整数常量。如果您绝对需要(可能会更改)数字代码,那么enum不是执行此任务的正确工具,最好使用数字常量。


您可以尝试此代码。

1
2
3
4
private enum DownloadType {
    AUDIO , VIDEO , AUDIO_AND_VIDEO ;

}

您可以这样使用这个枚举:DownloadType.AUDIO.ordinal()。希望这段代码片段对您有所帮助。


是否要此代码?

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
public String toString() {
    return value +"";
}

那么你可以简单地使用:

1
String something ="foo" + DownloadType.AUDIO;

将调用toStrug()方法。

< BR>请注意,使用ToStRun()编程通常被认为是很差的实践-它只针对人眼,但是这是实现你所要求的唯一方法。