有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java枚举返回Int

我在声明枚举时遇到问题。我试图创建的是“DownloadType”的枚举,其中有3种下载类型(音频、视频、音频和视频)

我实施了以下代码:

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

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

Font.PLAIN.value

共 (6) 个答案

  1. # 1 楼答案

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

    您不应该只依赖于enumint值。Java中的枚举是另一种怪物,与C中的枚举不同,后者依赖于它们的整数代码

    关于您在问题中提供的示例,Font.PLAIN有效,因为这只是Font类的一个整数常量。如果您绝对需要一个(可能正在更改)数字代码,那么enum不是适合此工作的工具,最好使用数字常量

  2. # 2 楼答案

    Font.PLAIN而不是枚举。它只是一个int。如果需要从枚举中提取值,则不能避免调用方法或使用.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() {}
    }
    

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

    enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO }
    

    并使用

    DownloadType.AUDIO_AND_VIDEO.ordinal()
    

    编辑:更正了代码^Java中不允许使用{}。有关如何在Java中定义静态类的解释和详细信息,请参见this SO answer

  3. # 3 楼答案

    如果需要获取int值,只需在枚举中为该值设置一个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
    
  4. # 4 楼答案

    如果要将枚举与字符串串联,则可以重写toString方法以返回int:

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

    然后你可以简单地使用:

    String something = "foo" + DownloadType.AUDIO;
    

    将调用toString()方法


    请注意,以编程方式使用toString()通常被认为是一种糟糕的做法——它仅适用于人眼,但这是实现您要求的唯一方法

  5. # 5 楼答案

    首先,你应该问自己以下问题:你真的需要整数吗

    枚举的目的是拥有一组项(常量),这些项在代码中具有意义,而不依赖外部值(如int)。Java中的枚举可以用作开关状态的参数,并且可以使用“==”相等运算符(以及其他运算符)安全地对它们进行比较

    方案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可能很有用(例如,如果外部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常量而不是enum(就像在接受的答案中一样),因为这样会破坏类型安全性
  6. # 6 楼答案

    你可以试试这个代码

    private enum DownloadType {
        AUDIO , VIDEO , AUDIO_AND_VIDEO ;
    
    }
    

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