我正在将一些使用int enum pattern的旧代码移植到Enum和EnumSet。这很容易,但我不知道如何将以下代码转换为EnumSet ::
int mask = (kind == 'C' ? CLASS_MODIFIERS
: kind == 'F' ? FIELD_MODIFIERS
: kind == 'M' ? METHOD_MODIFIERS
: (CLASS_MODIFIERS | FIELD_MODIFIERS | METHOD_MODIFIERS));
int bad_flags = flags & ~mask; // <--- this
flags &= mask; // <--- and this
~mask
输入EnumSet.complementOf
很简单,但我看不出&amp; 怎么做。
答案 0 :(得分:6)
您希望使用Set
方法retainAll来获取两组的交集:
public class Test {
public enum Kind { CLASS, FIELD, METHOD }
public void applyMask(char kind, EnumSet<Kind> flags) {
final EnumSet<Kind> mask;
switch (kind) {
case 'C': mask = EnumSet.of(Kind.CLASS); break;
case 'F': mask = EnumSet.of(Kind.FIELD); break;
case 'M': mask = EnumSet.of(Kind.METHOD); break;
default: mask = EnumSet.allOf(Kind.class); break;
}
EnumSet<Kind> badFlags = EnumSet.copyOf(flags);
badFlags.removeAll(mask); // See note below
flags.retainAll(mask);
}
}
注意:我之前有以下代替更简单的removeAll
。 Tom Hawtin指出removeAll
更简单,并达到了同样的目的。最初,我只是尽可能地复制了OP的原始逻辑,而没有尝试优化。
badFlags.retainAll(EnumSet.complementOf(mask));
答案 1 :(得分:-2)
CLASS_MODIFIERS
,FIELD_MODIFIERS
和METHOD_MODIFIERS
可能适合作为常量保留,因为它们被用作bit masks。该链接可能有助于澄清此代码的重点。