我使用的是通過或運算他們的價值觀像這樣將一個或多個枚舉庫包含一個枚舉set的元素:查找出來,如果一個int使用二進制運算
TestEnum {
VAL1(0x00000001),
VAL2(0x00000002),
VAL3(0x00000100),
VAL4(0x00000200),
VAL5(0x00000400),
VAL6(0x00000800),
VAL7(0x00001000),
VAL8(0x00002000),
VAL9(0x00004000),
VAL10(0x00008000),
// special values
VAL11(0x00000000),
VAL12(0x00000010),
VAL13(0x00000020),
VAL14(0x00000030);
private static final Map<Integer, TestEnum> TEST_ENUM_MAP;
// constructor, populate map etc.
public static TestEnum fromValue(final int value) {
return TEST_ENUM_MAP.get(value);
}
}
int valuesAsInt = 0;
for (TestEnum testEnum : TestEnum.values()) {
valuesAsInt |= testEnum.getValue();
}
我需要提取枚舉該合併產生valueAsInt
牢記的是:
- 的int必須包含特殊枚舉值之一(00000000 ... 0x00000030)
- 的int可以包含零個或多個非特殊枚舉值。
這是我做過什麼:
private static final int MASK_FOR_SPECIAL_ENUMS = 0x000000FF;
private static final ImmutableSet<TestEnum> SPECIAL_ENUMS = ImmutableSet.copyOf(Sets.newHashSet(TestEnum.VAL11, TestEnum.VAL12, TestEnum.VAL13, TestEnum.VAL14));
private void lookupTestEnums(final int valueAsInt) {
TestEnum testEnum = TestEnum.fromValue(valueAsInt & MASK_FOR_SPECIAL_ENUMS);
if (testEnum == null || !SPECIAL_ENUMS.contains(testEnum)) {
throw new ExceptionType("");
}
}
只是取與用面膜是不夠的,因爲它會爲TestEnum值返回陽性結果,VAL1 (0x00000001)
等
有沒有更好的這樣做的方式?
不知道你試着做什麼,而只是一個小小的建議:使用的,而不是一組枚舉的EnumSet。 http://docs.oracle.com/javase/7/docs/api/java/util/EnumSet.html –