【问题标题】:how to get a enum from a integer in java? [duplicate]如何从java中的整数中获取枚举? [复制]
【发布时间】:2012-09-05 11:28:39
【问题描述】:

可能重复:
How to get Enum Value from index in Java?

我有一个像这样的枚举:

public enum EnumTest {
    ONE, TWO, THREE
}

我如何得到一个像 1=ONE 2=TWO 3=THREE 这样的整数

现在我得到一个像 2 这样的整数,并想从中生成 EnumTest,它应该返回两个 怎么做?

【问题讨论】:

  • EnumTest.values()[Number-1]
  • 你不应该使用整数来获取Enum。
  • @AmitD Never 有点强 - 他可能被绑定到一个需要发送数字 1 但他想将其封装在枚举中的库。
  • @assylias 是的。我同意。我错过了这个观点。

标签: java


【解决方案1】:

或者,为了更灵活:

public enum EnumTest {
    ONE(1), TWO(2), THREE(3);

    private int value;


    EnumTest(int value) {
       this.value = value;
    }

    static EnumTest getByValue(int i) {
      for (EnumTest e : values()) {
          if (e.value == i) {
              return e;
          }
      }
      return null;
    }
}

想想看到这个枚举的未来开发人员,如果你留下一个未记录的values() 使用,任何人都可以通过添加新项目来破坏它。因为没有文档强制元素的顺序。

【讨论】:

  • 但是getByValue 方法将是O(n),对吧?你不能只做一个O(1) 数组查找吗?
  • @eboix,确实,这种形式的性能不如数组查找,但如果你真的需要性能,那么也许你不使用枚举而是 int(在这种情况下),或者你缓存静态数组中的结果,此处类似于values()array,但可以包含更多逻辑。在优化和可维护性/可读性/灵活性之间找到相同的平衡点
  • @eboix 对于 O(1),您可以使用预先填充静态块的 Map<Integer, EnumTest>。那么getByValue(int i) 的主体就是return map.get(i);。
  • @eboix 此外,如果 FOUR 被跳过并且 FIVE 存在,那么如果通过了 5 假设他有 5= FIVE,EnumTest[] 将抛出 ArrayIndexOutofBound
  • 你为什么要跳过FOUR????也许是出于空间考虑....也许是为了节省一些额外的字节....如果您不小心跳过了FOUR,那么最好您应该收到一条错误消息....
【解决方案2】:

您需要将int 与enum 值相关联。

你可以的

static final EnumTest[] VALUE = { null, ONE, TWO, THREE };

return VALUE[num];

或

return EnumTest.values()[num-1];

或使用地图。

【讨论】:

    【解决方案3】:

    像这样EnumTest.values()[Number-1] 获取它,其中 Number 是您的号码(即 1、2、3)。

    (从数字中减去 1,因为例如,ONE 将在索引 0 处,而EnumTest.values()[1] 将为您提供TWO。)

    【讨论】:

      【解决方案4】:

      如果你只想要序号,这里有一些有用的信息:

      • 你可以得到一个枚举常量的序数,例如EnumTest.ONE.ordinal()
      • 您可以使用 EnumTest.values() 检索所有枚举常量

      从此,你可以做你想做的事。

      如果你想添加一个任意值的属性,你可以在你的枚举中创建一个属性 + 构造函数 + getter:

      public enum EnumTest {
          THREE(3), ONE(1), TWO(2);
          private int val;
          EnumTest(int val) { this.val = val; }
          int getVal() { return val; }
      }
      

      这更稳定(如果您重命名/插入/移动它们,值会保持不变)。

      但是你确定你真的需要一个 int 值吗?如果可能,您应该始终使用枚举常量,例如EnumTest.THREE 而不是 3。

      我建议谷歌搜索有关 java 枚举的各种教程。

      【讨论】:

        【解决方案5】:

        尝试EnumTest.ordinal() 获取 int 值。 它将从 0 开始。
        要从值中获取枚举,您可以使用EnumTest.values()[i]。

        谢谢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 2014-10-23
          • 1970-01-01
          • 1970-01-01
          • 2020-11-04
          • 2011-02-08
          相关资源
          最近更新 更多