一尘不染

通过其内部字段获取枚举

java

具有内部字段的枚举,有点像地图。

现在,我需要按其内部字段枚举。

写下:

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;
    }
}

但是,每次需要查找适当的实例时,对所有枚举进行查找并不是非常有效。

还有其他方法可以做到吗?


阅读 263

收藏
2020-09-09

共1个答案

一尘不染

您可以将a staticMap<Integer,TestEnum>static初始化程序一起使用,该初始化程序将使用TestEnum由其number字段键入的值来填充它。

请注意,findByKey已完成staticnumber也已完成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()每次调用都会返回一个新分配的数组!原始O(N)解决方案可以通过只调用values()一次并缓存阵列来做得更好,但是该解决方案仍然是O(N)平均水平。

2020-09-09