我有一个看起来有点像这样的枚举:
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中是否有内置机制来执行此操作,或者我是否必须为其编写自己的逻辑?
答案 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而不是抛出异常。