如何将值从值转换为枚举?

时间:2010-10-15 14:13:58

标签: java enums

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

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

  public final int num;

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

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

3 个答案:

答案 0 :(得分:8)

是的,您必须编写自己的逻辑,因为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");
    }
}

答案 1 :(得分:1)

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

Enum.valueOf(Numbers.class, "ONE")

将返回Numbers.ONE

答案 2 :(得分:0)

如果您可以使用ZERO启动特定枚举,则可以执行

// ...
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); }
//..

这也有助于将索引更改为您喜欢的任何类型,如果您要求垃圾(可能更好),则返回null而不是抛出异常。