2009-05-23 3 views
3

Я портирую старый код, который использует int enum pattern для Enum и EnumSet. Это очень легко, но я не знаю, как перевести следующий код EnumSet::EnumSet 'и' operation

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, но я не вижу, как сделать &.

ответ

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

badFlags.retainAll(EnumSet.complementOf(mask)); 
+0

Я использую keepAll ... тест был неправильным. Спасибо в любом случае :) – dfa

+0

Какой тест был неправильным? – Eddie

+0

единичный тест, не прилагается здесь – dfa

-2

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

+2

нет Я больше не хочу использовать бит-маски – dfa

+0

Весь смысл этого сообщения заключается в том, чтобы переключиться с бит-масок на enums/enumsets – Ray

Смежные вопросы