Java检查枚举值是否是返回的其他枚举值集

时间:2016-12-12 09:53:39

标签: java enums

我使用Java获得了包含3个值的枚举。我得到了与1个或多个枚举值相关的类。

我知道如何创建列表并进行迭代,但有没有更好的方法来返回相关枚举值的单个值,我可以在其中检查是否包含其他值?例如:

public MyEnum mySupportedValues() 
{
    return MyEnum.Value1 | MyEnum.Value3; //not even sure if thats correct
}

然后能够检查枚举值是否是受支持列表的一部分:

public boolean isMyEnumSupported(ClassA aInstance)
{
    MyEnum aSupportedValues = aInstance.mySupportedValues();
    MyEnum mySupportedValue = getMyValue();
    return aSupportedValues contains mySupportedValue; //not sure how to check
}

3 个答案:

答案 0 :(得分:1)

Java中的枚举不仅仅是简单的数值,你可以在数字上"或者在一起。

因此,您的方法必须返回某种"集合"枚举值,所以它应该读

public EnumSet<MyEnum> mySupportedValues() {
  return EnumSet.of(MyEnum.Value1, MyEnum.Value2);
}

代替。作为&#34;一些收集&#34;在这种情况下,归结为EnumSet是正确的选择。

然后你的另一个方法可以简单地使用你从其他方法得到的那个EnumSet对象的contains()方法。

答案 1 :(得分:1)

它应该稍微修改一下你的代码。

public EnumSet<MyEnum> mySupportedValues() 
{
   return EnumSet.of(MyEnum.Value1, MyEnum.Value3);
}


public boolean isMyEnumSupported(ClassA aInstance)
{
   EnumSet<MyEnum> aSupportedValues = aInstance.mySupportedValues();
   MyEnum mySupportedValue = getMyValue();
   return aSupportedValues.contains(mySupportedValue);
}

https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html EnumSet是一个专门的Set类,可以占用enum个常量。

答案 2 :(得分:1)

轻量级解决方案

public class Main {

    private enum Flag {
        VALUE1, VALUE2, VALUE3, VALUE4;

        int getBitFlag() {
            return 1 << ordinal();
        }

        boolean isSupported(int bitFlag) {
            return (0 != (getBitFlag() & bitFlag));
        }
    }

    private static int mySupportedValues() {
        return Flag.VALUE1.getBitFlag() | Flag.VALUE3.getBitFlag();
    }

    private static boolean isMyEnumSupported(Flag flag) {
        int supportedValues = mySupportedValues();
        return flag.isSupported(supportedValues);
    }

    public static void main(String[] args) {
        Flag toBeTested = Flag.VALUE3;
        System.out.println(isMyEnumSupported(toBeTested) ? "Supported" : "Not Supported");

        toBeTested = Flag.VALUE2;
        System.out.println(isMyEnumSupported(toBeTested) ? "Supported" : "Not Supported");
    }

}

EnumSet基于集合框架,并在您选中contains时使用迭代器。以上解决方案使用位掩码。

注意:解决方案最多只能运行32个值。