Java Enum返回Int

时间:2012-12-09 21:35:08

标签: 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;
    }
}

如果我像这样使用它,这可以正常工作:

DownloadType.AUDIO_AND_VIDEO.value;

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

Font.PLAIN

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

Font.PLAIN.value

8 个答案:

答案 0 :(得分:93)

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

如果您真的只需要int,那么您已经接受了类型安全性丢失,用户可能会将无效值传递给您的API,可能< / em>将这些常量定义为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() {}
}

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

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }

并使用

获取“值”
DownloadType.AUDIO_AND_VIDEO.ordinal()

编辑:更正了代码.. Java中不允许使用static class。请参阅this SO answer,其中包含有关如何使用Java定义静态类的说明和详细信息。

答案 1 :(得分:47)

如果您需要获取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

答案 2 :(得分:12)

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

枚举的目的是拥有一组项(常量),这些项在代码中具有意义而不依赖于外部值(如int)。 Java中的枚举可以用作切换器状态的参数,可以使用&#34; ==&#34;来安全地进行比较。平等操作员(等等)。

提案1(无需任何内容):

通常不需要在它后面有一个整数,然后只需使用它:

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;
}

提案2(需要int):

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

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。
  • 通常不要使用int常量而不是枚举(比如接受的答案),因为你会失去类型安全性。

答案 3 :(得分:10)

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

您不应仅依赖int的{​​{1}}值,而只取决于其实际值。 Java中的枚举是一种不同的怪物,它不像C中的枚举,你依赖于它们的整数代码。

关于您在问题中提供的示例,enum有效,因为它只是Font类的整数常量。如果您绝对需要(可能更改)数字代码,那么Font.PLAIN不适合作业,更好地坚持数字常量。

答案 4 :(得分:4)

您可以尝试使用此代码。

private enum DownloadType {
    AUDIO , VIDEO , AUDIO_AND_VIDEO ;

}

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

答案 5 :(得分:3)

如果使用字符串连接枚举,可以覆盖toString方法以返回int:

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

然后你可以简单地使用:

String something = "foo" + DownloadType.AUDIO;

将调用toString()方法。


请注意,以编程方式使用toString()通常被认为是不好的做法 - 它仅供人眼使用,但这是实现您所要求的唯一方法。

答案 6 :(得分:3)

你想要这个代码吗?

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

答案 7 :(得分:2)

我认为最易读的版本

DropdownButton<String>(
value: dropdownValue,
icon: Icon(Icons.arrow_downward),
iconSize: 24,
elevation: 16,
style: TextStyle(
  color: Colors.deepPurple
),
underline: Container(
  height: 2,
  color: Colors.deepPurpleAccent,
),
onChanged: (String newValue) {
  setState(() {
    dropdownValue = newValue;
  });
},
items: <String>['One', 'Two', 'Free', 'Four']
  .map<DropdownMenuItem<String>>((String value) {
    return ListTile(
            onTap: () {},
            leading: CircleAvatar(backgroundColor: Colors.primaries[0]),
            title: Text(value),
          );
  })
  .toList(),