通过其内部字段获取枚举

2022-09-01 02:57:16

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

现在我需要通过它的内场来获取枚举。

写了这个:

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

但是,每次我需要找到合适的实例时,查找所有枚举并不是很有效。

有没有其他方法可以做同样的事情?


答案 1

可以将 与 初始值设定项一起使用,该初始值设定项使用由其字段键入的值填充它。static Map<Integer,TestEnum>staticTestEnumnumber

请注意,已经制作,并且也已经制作。findByKeystaticnumberfinal

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)

引用

相关问题


关于values()

该方法中的第二个语句是揭示的:每次调用时返回一个新分配的数组!最初的解决方案可以通过只调用一次并缓存数组来做得更好,但该解决方案仍然是平均的。printlnmainvalues()O(N)values()O(N)


答案 2

虽然有人建议使用三思而后行。Map<Integer, TestEnum>

您的原始解决方案(尤其是对于小枚举)可能比使用 HashMap 快得多。

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

这是“如果它没有损坏,就不要修复它”的一种情况。