2009-05-23 6 views
3

EnumとEnumSetにint enum patternを使用する古いコードを移植しています。それは非常に簡単ですが、私はEnumSetのに次のコードを変換する方法がわからない:EnumSet 'and' 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 

~maskEnumSet.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簡素の代わりに次の行を持っていました。 Tom HawtinはremoveAllがより簡単で同じ目的を達成すると指摘しました。もともと、私は最適化しようとせずに、OPの元のロジックを可能な限り密接にコピーしました。

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

私はretainAllを使用しています...テストが間違っていました。とにかくありがとう:) – dfa

+0

どのようなテストが間違っていた? – Eddie

+0

単体テスト、ここには添付されていません – dfa

-2

CLASS_MODIFIERSFIELD_MODIFIERS、と彼らは​​として使用されているので、METHOD_MODIFIERSは、定数として残すことが適切な場合があります。リンクは、このコードのポイントを明確にするのに役立ちます。

+2

いいえもうビットマスクを使用したくありません – dfa

+0

この投稿のポイントは、ビットマスクから列挙型/列挙型に切り替えることです – Ray