EnumSet'和'操作

dfa*_*dfa 3 java enums

我正在将一些使用int枚举模式的旧代码移植到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
Run Code Online (Sandbox Code Playgroud)

~mask打字很简单,EnumSet.complementOf但我看不怎么做&.

Edd*_*die 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);
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:我以前使用以下代码来代替更简单的代码removeAll.汤姆霍廷指出,这removeAll更简单,达到了同样的目的.最初,我只是尽可能地复制了OP的原始逻辑,而没有尝试优化.

    badFlags.retainAll(EnumSet.complementOf(mask));
Run Code Online (Sandbox Code Playgroud)