包含内部字段,地图类型。
现在我需要通过其内部领域获得枚举。
写道:
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;
}
}
但是每次我需要找到合适的实例时,查看所有枚举都不是很有效。
还有其他方法可以做同样的事吗?
答案 0 :(得分:56)
您可以将static Map<Integer,TestEnum>
与static
初始值设定项一起使用,并使用TestEnum
字段键入的number
值填充它。
请注意,findByKey
已成为static
,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)
操作。
values()
println
方法中的第二个main
语句显示:values()
返回每个invokation的新分配数组!原始O(N)
解决方案可以通过仅调用values()
一次并缓存数组来做得更好一些,但该解决方案平均仍为O(N)
。
答案 1 :(得分:16)
虽然有人建议使用Map<Integer, TestEnum>
三思而后行。
您的原始解决方案,尤其是小型枚举,可能比使用HashMap更快。
在你的枚举包含至少30到40个元素之前,HashMap可能不会更快。
这是“如果没有破坏,请不要修复它”的一个案例。
答案 2 :(得分:1)
这是通过其字段查找枚举值的最便捷方法:
public enum TestEnum {
A("EXAMPLE_1", "Qwerty", 1),
B("EXAMPLE_2", "Asdfgh", 2),
C("EXAMPLE_3", "Zxcvbn", 3);
private final String code;
private final String name;
private final Integer typeID;
TestEnum(String code, String name, Integer typeID) {
this.code = code;
this.name = name;
this.key = typeID;
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public Integer getKey() {
return key;
}
public static TestEnum findValueByTypeId(Integer key) {
return Arrays.stream(TestEnum.values()).filter(v ->
v.getKey().equals(key)).findFirst().orElseThrow(() ->
new Exception(String.format("Unknown TestEnum.key: '%s'", key)));
}
}
答案 3 :(得分:0)
你应该有一个HashMap,其中数字为键,枚举值为值。
此地图通常位于您的存储库中。然后,您可以使用首选的枚举值轻松替换数据库中的int变量。
如果你的密钥(int值)存储在一个数据库中,那么我会说它的糟糕设计是在你的业务层的枚举中携带这些密钥。如果是这种情况,我建议不要将int值存储在枚举中。
答案 4 :(得分:0)
一种解决方案是添加
public final Test[] TESTS = { null, ONE, TWO, THREE };
public static Test getByNumber(int i) {
return TESTS[i];
}
致enum。
如果内部数据不是整数,您可以在static { ... }
初始值设定项中填充Map。稍后可以在上面的getByNumber
方法中使用此地图。