通过其内部领域获得枚举
有内场,地图的枚举。
现在我需要通过其内部领域获得枚举。
写道:
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
与static
初始化程序一起使用,该初始化程序使用由其number
字段键入的TestEnum
值填充它。
请注意, findByKey
已经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 map; static { map = new HashMap(); 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中初始化静态地图
关于values()
注意事项values()
main
方法中的第二个println
语句显示: values()
返回每个invokation的新分配数组! 原始的O(N)
解决方案可以通过仅调用一次values()
并缓存数组来做得更好,但该解决方案平均仍然是O(N)
。
虽然有人建议使用Map
三思而后行。
您的原始解决方案,尤其是小型枚举,可能比使用HashMap更快。
在你的枚举包含至少30到40个元素之前,HashMap可能不会更快。
这是“如果没有损坏,请不要修理”的一个案例。
您应该有一个HashMap,其中数字为键,枚举值为值。
此映射通常可以位于您的存储库中。 然后,您可以使用首选的枚举值轻松地从数据库中替换int变量。
如果您的密钥(int值)存储在数据库中,那么我会说它的糟糕设计是在业务层的枚举中携带这些密钥。 如果是这种情况,我建议不要将int值存储在枚举中。
一种解决方案是添加
public final Test[] TESTS = { null, ONE, TWO, THREE }; public static Test getByNumber(int i) { return TESTS[i]; }
对于枚举。
如果内部数据不是整数,则可以使用static { ... }
初始化程序填充的Map。 稍后可以在上面的getByNumber
方法中使用此映射。