Java 如何将值转换为枚举?

Java 如何将值转换为枚举?,java,enums,Java,Enums,我有一个枚举,看起来有点像这样: public enum Numbers { ONE(1), TWO(2), THREE(3); public final int num; public Numbers(int num) { this.num = num; } } 我希望能够从参数转换为枚举,例如从int1转换为enumONE。Java Enum中是否有任何内置机制来执行此操作,或者我必须为其编写自己的逻辑?是的,您必须编写自己的逻辑,因为num变量是您自己逻辑的一

我有一个枚举,看起来有点像这样:

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

  public final int num;

  public Numbers(int num) {
    this.num = num;
  }
}

我希望能够从参数转换为枚举,例如从int
1
转换为enum
ONE
。Java Enum中是否有任何内置机制来执行此操作,或者我必须为其编写自己的逻辑?

是的,您必须编写自己的逻辑,因为
num
变量是您自己逻辑的一部分:

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

    public final int num;

    private Numbers(int num) {
        this.num = num;
    }

    public static Numbers getNumber(int i){
        for(Numbers number : Numbers.values()){
            if(i == number.num){
                return number;
            }
        }
        throw new IllegalArgumentException("This number doesn't exist");
    }
}

如果你想从序数转换,你必须自己做。但是,可以从枚举的名称自动转换。顺便说一句,不需要指定序号,这是自动完成的,它从0开始,并且有一个ordinal()getter


将返回数字。1

如果可以用
零开始特定枚举,则可以

// ...
private static final Numbers[] list = values();
public static Numbers get(int which) { return list[i]; }
// ...
忽略为枚举指定索引

编辑:重构安全选项:

//..
private static final Map<Integer, Numbers> getter; static {
 Numbers[] ns = values();
 getter = new HashMap<Integer, Numbers>(ns.length, 1f);
 for (Numbers n : ns) getter.put(n.num, n);
}
public static Numbers get(int which) { return getter.get(which); }
//..
/。。
私有静态最终映射获取程序;静止的{
数字[]ns=值();
getter=newhashmap(ns.length,1f);
for(数字n:ns)getter.put(n.num,n);
}
公共静态数get(int which){return getter.get(which);}
//..

这也有助于将索引更改为您喜欢的任何类型,并在请求垃圾时返回null,而不是抛出异常(这可能更可取)。

这支持一个比我的答案更一般的问题(基本上,不管您喜欢什么索引系统),但是有一些性能折衷:每次查找调用时增量搜索匹配值,索引内存,每次查找调用时iirc创建
values()
数组。@卡尔,是的,我想解决方案是在
I
上有一个switch语句,并根据
switch
的值返回
。我会快得多。但是这样做太难看了。另外,如果你打算这样做,为什么不使用一个静态创建映射的
映射呢?@Carl,正如我所说,我在前面的评论中找到了解决方案,这变得更难看了:p这不是一个好主意,因为它不仅有点脆弱,而且依赖于枚举常量的序数值,与
num
字段无关。如果将枚举定义为
公共枚举数{3(3)、2(2)、1(1)、0(0)}
,这是完全合法的,那么您的代码将返回错误的值。@Andrzej:它确实依赖于这个事实,是的,依赖于这个事实是脆弱的。但是,如果问题足够简单(一个全面的判断调用),那么额外的灵活性可能不值得更灵活的解决方案对性能造成的影响。我随时都会接受(可能是微不足道的)性能影响,超过在“安全”重构期间中断的代码。如果改进的性能是推荐这种方法的唯一原因,那么Knuth有话要对您说。@Andrzej:比性能更重要的是,与重构安全选项相比,我的第一个答案很容易实现(我想说是微不足道的)。在第一步中,我会提到这一点,如果出现非平凡的重构,请注意一个简短的“TODO:实现重构安全选项”。是的,我可能会重复工作,但如果问题真的很简单,我从不重构,我会花更少的时间获得更好的性能。比如…惰性实例化,仅用于设计。为什么不
number.valueOf(“ONE”)
@user102008-不太清楚我写这篇文章时的想法:)
//..
private static final Map<Integer, Numbers> getter; static {
 Numbers[] ns = values();
 getter = new HashMap<Integer, Numbers>(ns.length, 1f);
 for (Numbers n : ns) getter.put(n.num, n);
}
public static Numbers get(int which) { return getter.get(which); }
//..