关于java:通过其内部字段获取枚举

Get enum by its inner field

具有内部字段的枚举,类似于映射。

现在,我需要通过其内部字段获取枚举。

写下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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已制成staticnumber也已制成final

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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"
    }
}

您现在可以期望findByKeyO(1)操作。

工具书类

  • JLS 8.7静态初始值设定项
  • JLS 8.9枚举

相关问题

  • Java中的静态引用程序
  • 如何在爪哇初始化静态地图

关于values()的说明

main方法中的第二条println语句显示:values()在每次调用时都返回一个新分配的数组!最初的O(N)解决方案只需调用values()一次并缓存数组,就可以做得更好一些,但该解决方案平均仍为O(N)


尽管有人建议使用Map,但还是要三思。

您最初的解决方案,特别是对于小的枚举,可能比使用哈希图更快。

在枚举包含至少30到40个元素之前,hashmap可能不会更快。

这是一个"如果它不坏,就不要修理它"的例子。


一个解决方案是添加

1
2
3
4
5
public final Test[] TESTS = { null, ONE, TWO, THREE };

public static Test getByNumber(int i) {
    return TESTS[i];
}

到枚举。

如果内部数据不是整数,则可以在static { ... }初始值设定项中填充映射。该图稍后可用于上述getByNumber方法中。


您应该有一个哈希映射,其中数字作为键,枚举值作为值。

此映射通常可以在您的存储库中。然后,您可以用首选的枚举值轻松地替换数据库中的int变量。

如果您的键(int值)存储在数据库中,那么在您的业务层的枚举中携带这些键是一种糟糕的设计。如果是这种情况,我建议不要在枚举中存储int值。