有带有内部字段的枚举,类似地图。
现在我需要通过其内部字段获取枚举。
写了这个:
package test;
/**
* Test enum to test enum =)
*/
public enum TestEnum {
ONE(1), TWO(2), THREE(3);
private int number;
TestEnum(int number) {
this.number = number;
}
public TestEnum findByKey(int i) {
TestEnum[] testEnums = TestEnum.values();
for (TestEnum testEnum : testEnums) {
if (testEnum.number == i) {
return testEnum;
}
}
return null;
}
}
但是每次我需要找到合适的实例时都查找所有枚举并不是很有效。
还有其他方法可以做到同样的事情吗?
您可以使用static Map<Integer,TestEnum>
with a static
初始化程序,用TestEnum
他们的价值观number
fields.
注意findByKey
已做出static
, and number
也已做出final
.
import java.util.*;
public enum TestEnum {
ONE(1), TWO(2), SIXTY_NINE(69);
private final int number;
TestEnum(int number) {
this.number = number;
}
private static final Map<Integer,TestEnum> map;
static {
map = new HashMap<Integer,TestEnum>();
for (TestEnum v : TestEnum.values()) {
map.put(v.number, v);
}
}
public static TestEnum findByKey(int i) {
return map.get(i);
}
public static void main(String[] args) {
System.out.println(TestEnum.findByKey(69)); // prints "SIXTY_NINE"
System.out.println(
TestEnum.values() == TestEnum.values()
); // prints "false"
}
}
您现在可以期待findByKey
成为一个O(1)
手术。
参考
- JLS 8.7 静态初始化器
- JLS 8.9 枚举
相关问题
- Java 中的静态初始化器
- 如何在 Java 中初始化静态地图
Note on values()
第二println
中的声明main
方法揭示:values()
每次调用都会返回一个新分配的数组!原本的O(N)
解决方案只需调用即可做得更好一点values()
一次并缓存数组,但该解决方案仍然是O(N)
一般。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)