繁体   English   中英

检查枚举是否存在

[英]checking if the enum exists

我有:

@AllArgsConstructor
public enum EnumTest {

    ENUM_TEST1(1),
    ENUM_TEST2(2),
    ENUM_TEST3(3),
    ENUM_TEST4(4),
    ENUM_TEST5(5),
    ENUM_TEST6(6),
    ENUM_TEST7(7),
    ENUM_TEST8(8),
    ENUM_TEST9(9),
    ENUM_TEST10(10);

    private int value;

}

我想检查一个参数是否在枚举中,我可以这样做:

EnumUtils.isValidEnum(EnumTest.class,"ENUM_TEST6");

但是仅比较一些枚举的正确方法是什么,例如,我有这个:

Arrays.asList(ENUM_TEST6,ENUM_TEST7).contains(newParam.getEnumTest());

但是 asList 使用 (new) 所以做这样的事情来提高性能是正确的,或者你能想到的最佳实践是什么?

ENUM_TEST6.equals(newParam.getEnumTest()) || ENUM_TEST7.equals(newParam.getEnumTest());

不要使用Arrays.asList(ENUM_TEST6,ENUM_TEST7) ,而是使用EnumSet

EnumSet.of(ENUM_TEST6, ENUM_TEST7)

如果这是可重用的,请将其添加到enum

@AllArgsConstructor
public enum EnumTest {

    ENUM_TEST1(1),
    ENUM_TEST2(2),
    ENUM_TEST3(3),
    ENUM_TEST4(4),
    ENUM_TEST5(5),
    ENUM_TEST6(6),
    ENUM_TEST7(7),
    ENUM_TEST8(8),
    ENUM_TEST9(9),
    ENUM_TEST10(10);

    private int value;

    private static final EnumSet<EnumTest> TEST_6_7 = EnumSet.of(ENUM_TEST6, ENUM_TEST7);

    public static boolean is6or7(EnumTest value) {
        return TEST_6_7.contains(value);
    }
}

如果有效枚举的集合非常大,您将希望使用asList实现 go,但创建该列表并将其存储在适当的 scope 中以供重用。 如果有效枚举的集合很小(例如 2-5),则使用列表(或其他集合)会做很多不必要的工作。

但是,您需要调整代码,如果getEnumTest回答一个字符串,则既不contains也不equals将起作用。 该集合将是枚举的名称: ENUM_TEST6.name()

此外,如果有效枚举的集合非常大,则HashSet会更好,因为基本实现中的List.contains (例如ArrayList )对于大型 collections 会很慢。

考虑这样做。 这就是EnumSets的用途。 它们还包括

  • EnumSet.complementOf
  • EnumSet.allOf
  • EnumSet.noneOf
    public static void main(String[] args) {
        method(EnumSet.of(EnumTest.ENUM_TEST1, EnumTest.ENUM_TEST2));

    }   
    public static void method(EnumSet<EnumTest> eset) {
        if (eset.containsAll(EnumSet.of(EnumTest.ENUM_TEST1,EnumTest.ENUM_TEST2))) {
            // do something.
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM