【问题标题】:Given the numeric value of a particular enum type, how can I retrieve the name? [duplicate]给定特定枚举类型的数值,我如何检索名称? [复制]
【发布时间】:2013-05-23 20:17:41
【问题描述】:

我正在尝试设置我的枚举,使其具有名称列表并检索给定值的特定名称。

示例: 枚举 {香草、巧克力、草莓};

给定 0,返回 Vanilla。 给定 1,返回 Chocolate。 给定 2,返回草莓。

我还没有找到任何随 Java Enum 类一起提供的开箱即用的方法。我正在考虑编写自己的,将值转储到数组中,然后使用二进制搜索返回它们,给定一个特定的数字。

有没有内置的东西会更好?

谢谢!

【问题讨论】:

    标签: java


    【解决方案1】:

    如果你的id对应枚举项的位置,可以使用内置的values()ordinal()-Methods。

    // to enum
    int intValue = 0;
    CustomEnum item = CustomEnum.values()[intValue];
    
    // to int
    CustomEnum item = CustomEnum.SOME_ITEM;
    int intValue = item.ordinal();
    

    【讨论】:

    • 使用枚举的内部值不是一个好习惯,如果您在源代码中重新排序列表可以更改。
    • 这就是为什么我写了“如果你的 id 对应于枚举项的位置”
    【解决方案2】:

    你必须在枚举中实现它。像这样:

    public enum MyEnum {
      VANILLA(0), CHOCOLATE(1), STRAWBERRY(2);
    
      private int i;
    
      private MyEnum(int i) {
         this.i = i;
      }
    
      public static MyEnum getFoodById(int id) trhows IllegalArgumentException {
         MyEnum result = null;
         switch (id):
           case 0: {
             result = MyEnum.VANILLA;
             break;
           }
           case 1: {
             result = MyEnum.CHOCOLATE;
             break;
           }
           case 2: {
             result = MyEnum.STRAWBERRY;
             break;
           }
           default : { 
              throw new IllegalArgumentException("Invalid id ...");
           }
       }
       return result;
    }
    

    【讨论】:

    • 这是正确的,因为使用枚举的“内部索引”不是一个好主意,如果重构代码(重新排序列表)可以更改。通过这种方式,您可以确定为每个对象分配的编号。
    • 当然。投票:)
    • +1 表示正确的方法。
    • 那行不通...实际上甚至为此进行编译。开关中的i 应为id
    • 谢谢你,你是对的。我更新了答案。 :)
    【解决方案3】:

    您可以使用 EnumMap。您可以查看here 以获取解决方案和示例。

    【讨论】:

      【解决方案4】:

      你也可以这样做:

      公共枚举 IntEnum {

      Vanilla(0), Chocolate(1), Strawberry(2);
      
      private int value;
      
      IntEnum(int value) {
          this.value = value;
      }
      
      public int getValue() {
          return value;
      }
      
      public static IntEnum getEnum(int intValue) {
          Integer value = intValue;
      
          if (value == null)
              throw new IllegalArgumentException();
          for (IntEnum v : values())
              if (value.equals(v.getValue()))
                  return v;
          throw new IllegalArgumentException();
      }
      
      
      
      public static void main(String[] args) {
      
          System.out.println(IntEnum.getEnum(1));         
      }
      

      }

      【讨论】:

      • 应该直接使用int而不是Integer,避免null值传递给你的方法的可能性。
      • 感谢您指出这一点。我已经编辑了原始答案
      【解决方案5】:

      枚举确实允许内置函数。

      public enum Flavor
      {
          VANILLA("Vanilla"),
          CHOCOLATE("Chocolate"),
          STRAWBERRY("Strawberry");
      
          private final String desc;
      
          Flavor(String desc)
          {
              this.desc = desc;
          }
      
          public String getDesc()
          {
              return desc;
          }
      }
      

      【讨论】:

      • 这与问题有什么关系?
      【解决方案6】:
      public enum Flavor {
          Vanilla, Chocolate, Strawberry
      }
      
      Flavor v = Flavor.values()[0];
      
      String name = v.name(); // "Vanilla"
      

      http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#name()

      【讨论】:

      • 这不是枚举在 java 中的工作方式。
      • @FDinoff 你这是什么意思?
      【解决方案7】:

      使用 values() 结果:

      enum Flavours {Vanilla, Chocolate, Strawberry}
      
      assertTrue(Flavours.Vanilla == Flavours.values()[0]);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        相关资源
        最近更新 更多