Java Enum返回Int

Cri*_*ian 71 java enums

我无法宣布枚举.我正在尝试创建的是"DownloadType"的枚举,其中有3种下载类型(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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

DownloadType.AUDIO_AND_VIDEO.value;
Run Code Online (Sandbox Code Playgroud)

但是,我希望它能让我不必要求"价值".我可能会弄错,但这是几个类在Java中工作的方式,比如Font,例如设置字体样式,你使用:

Font.PLAIN
Run Code Online (Sandbox Code Playgroud)

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

Font.PLAIN.value
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 100

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

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

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

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

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }
Run Code Online (Sandbox Code Playgroud)

并使用获得"价值"

DownloadType.AUDIO_AND_VIDEO.ordinal()
Run Code Online (Sandbox Code Playgroud)

编辑:更正了static classJava中不允许的代码.. 请参阅此SO答案,并提供有关如何在Java中定义静态类的说明和详细信息.

  • 序数可能会导致系统不稳定 (2认同)

Per*_*ror 52

如果您需要获取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
}
Run Code Online (Sandbox Code Playgroud)

或者您可以简单地使用该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
Run Code Online (Sandbox Code Playgroud)

  • 为什么只需调用.value就需要额外的方法,并且已经提供了一个方法ordinal()来获取整数. (3认同)

yon*_*joy 13

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

枚举的目的是拥有一组项(常量),这些项在代码中具有意义而不依赖于外部值(如int).Java中的枚举可以用作切换器状态的参数,可以使用"=="等式运算符(以及其他)安全地进行比较.

建议1(无需int):

通常不需要背后的整数.

private enum DownloadType{
    AUDIO, VIDEO, AUDIO_AND_VIDEO
}
Run Code Online (Sandbox Code Playgroud)

提案2(需要int):

然而,有时将枚举转换为int可能很有用(例如,如果外部API需要int值).在这种情况下,我建议使用toXxx()-Style 将方法标记为转换方法.用于打印覆盖toString().

DownloadType downloadType = MyObj.getDownloadType();
if (downloadType == DownloadType.AUDIO) {
    //...
}
//or
switch (downloadType) {
  case AUDIO:  //...
          break;
  case VIDEO: //...
          break;
  case AUDIO_AND_VIDEO: //...
          break;
}
Run Code Online (Sandbox Code Playgroud)

摘要

  • 如果不需要,请不要将整数与枚举一起使用.
  • 不要依赖于使用ordinal()获取枚举的整数,因为如果添加其他枚举常量或更改顺序,此值可能会更改.
  • 通常不要使用int常量而不是枚举(如在接受的答案中),因为你将失去类型安全性(如提到的@KennyTM).


Ósc*_*pez 10

只需ordinal()在枚举值上调用方法,即可检索其对应的数字.不需要使用其值声明add属性,默认情况下每个枚举值都有自己的数字,从零开始分配,每个值按照它们声明的相同顺序递增1.

你不应该依赖于a的intenum,只能依赖于它的实际值.Java中的枚举是一种不同的怪物,它不像C中的枚举,你依赖于它们的整数代码.

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


osi*_*the 5

您可以尝试此代码。

private enum DownloadType {
    AUDIO , VIDEO , AUDIO_AND_VIDEO ;

}
Run Code Online (Sandbox Code Playgroud)

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