通过其内部领域获得枚举

有内场,地图的枚举。

现在我需要通过其内部领域获得枚举。

写道:

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 Mapstatic初始化程序一起使用,该初始化程序使用由其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" } } 

您现在可以期望findByKeyO(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方法中使用此映射。