EnumSet 'и' операция - PullRequest
       9

EnumSet 'и' операция

3 голосов
/ 23 мая 2009

Я портирую некоторый старый код, который использует шаблон int enum , на 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, но я не понимаю, как это сделать & .

Ответы [ 2 ]

6 голосов
/ 23 мая 2009

Вы хотите использовать метод 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. Том Хотин отметил, что removeAll проще и достигает той же цели. Первоначально я просто максимально точно скопировал оригинальную логику ОП, не пытаясь оптимизировать.

    badFlags.retainAll(EnumSet.complementOf(mask));
0 голосов
/ 23 мая 2009

CLASS_MODIFIERS, FIELD_MODIFIERS и METHOD_MODIFIERS может быть целесообразно оставить в качестве констант, поскольку они используются в качестве битовых масок . Ссылка может помочь прояснить смысл этого кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...