代码之家  ›  专栏  ›  技术社区  ›  dfa

Enumset'和'操作

  •  3
  • dfa  · 技术社区  · 15 年前

    我正在移植一些使用 int enum pattern 枚举和枚举。这很容易,但我不知道如何将以下代码翻译为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 但我不知道怎么办 & .

    2 回复  |  直到 15 年前
        1
  •  6
  •   Eddie    15 年前

    你想用 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 . 汤姆·霍丁指出 移除所有 更简单,达到相同的目的。最初,我只是尽可能地复制操作的原始逻辑,而不尝试优化。

        badFlags.retainAll(EnumSet.complementOf(mask));
    
        2
  •  -2
  •   Paul Morie    15 年前

    CLASS_MODIFIERS , FIELD_MODIFIERS METHOD_MODIFIERS 可能适合保留为常量,因为它们被用作 bit masks . 链接可能有助于澄清此代码的要点。