通过其内部领域获得枚举

时间:2010-05-06 09:54:10

标签: java enums

包含内部字段,地图类型。

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

写道:

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

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

还有其他方法可以做同样的事吗?

5 个答案:

答案 0 :(得分:56)

您可以将static Map<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()返回每个invokation的新分配数组!原始O(N)解决方案可以通过仅调用values()一次并缓存数组来做得更好一些,但该解决方案平均仍为O(N)

答案 1 :(得分:16)

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

您的原始解决方案,尤其是小型枚举,可能比使用HashMap更快。

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

这是“如果没有破坏,请不要修复它”的一个案例。

答案 2 :(得分:1)

这是通过其字段查找枚举值的最便捷方法:

public enum TestEnum {

  A("EXAMPLE_1", "Qwerty", 1),
  B("EXAMPLE_2", "Asdfgh", 2),
  C("EXAMPLE_3", "Zxcvbn", 3);

  private final String code;
  private final String name;
  private final Integer typeID;

  TestEnum(String code, String name, Integer typeID) {
    this.code = code;
    this.name = name;
    this.key = typeID;
  }

  public String getCode() {
    return code;
  }

  public String getName() {
    return name;
  }

  public Integer getKey() {
    return key;
  }

  public static TestEnum findValueByTypeId(Integer key) {
    return Arrays.stream(TestEnum.values()).filter(v ->
        v.getKey().equals(key)).findFirst().orElseThrow(() ->
        new Exception(String.format("Unknown TestEnum.key: '%s'", key)));
  }
}

答案 3 :(得分:0)

你应该有一个HashMap,其中数字为键,枚举值为值。

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

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

答案 4 :(得分:0)

一种解决方案是添加

public final Test[] TESTS = { null, ONE, TWO, THREE };

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

致enum。

如果内部数据不是整数,您可以在static { ... }初始值设定项中填充Map。稍后可以在上面的getByNumber方法中使用此地图。