鉴于以下定义:
public enum SampleEnum1 { Uno, Dos, Tres }
public enum SampleEnum2 { One, Two, Three, Four }
我需要两种方法:
Dos
则返回SampleEnum1
,Two
如果应用于SampleEnum2
One
,返回1
实际上我需要在枚举定义中将枚举文本转换为序列号,反之亦然。
我不介意使用泛型,反射或其他任何东西,只要相同的2种方法适用于任何枚举。
你有解决方案吗?
答案 0 :(得分:1)
如果你可以确保在源文件中按顺序保存你的枚举,你可以这样做以按编号获取枚举:
public static SampleEnum1 getSpanishEnum(int index) {
return SampleEnum1.values()[index - 1];
}
public static SampleEnum2 getEnglishEnum(int index) {
return SampleEnum2.values()[index - 1];
}
另一方面,你可以做一个循环
public static <E extends Enum> getEnumIndex(E value, E[] values) {
for(int i = 0; i < values.length; i++) {
if(value == values[i]) {
return i + 1;
}
}
throw new NoSuchElementException();
}
这样称呼它:
getEnumIndex(SampleEnum1.Dos, SampleEnum1.values());
答案 1 :(得分:1)
另一种方法是使用辅助方法,如
public static <E etxends Enum<E>> E lookup(Class<E> eClass, int number) {
return eClass.getEnumConstants()[number-1];
}
SampleEnum1 se1 = lookup(SampleEnum1.class, 2);
BTW:你可以从Zero开始,这也会简化你的代码。
答案 2 :(得分:1)
可以使用Class.getEnumConstants()
方法完成前进方向:
public static <E extends Enum<E>> E getValue(Class<E> eClass, int index) {
return eClass.getEnumConstants()[index - 1];
}
如下所示:
SampleEnum2 two = getValue(SampleEnum2.class, 2);
(不幸的是,我们不能编写一个使用每个values()
所拥有的enum
方法的泛型方法。它是静态的,因此我们无法通过多态调度来访问它。反过来访问它我们需要知道实际的E
类......这需要一个Class<E>
对象。如果你必须通过它,你也可以调用它的getEnumConstants
方法。 )
反方向更简单:
public static <E extends Enum<E>> int getIndex(E e) {
return e.ordinal() + 1;
}
当然,如果按照正常的IT约定,集合的索引从零开始,则更为简洁。