我使用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
}
答案 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个值。