2009-05-23 6 views
3

Ich portiere alten Code, der die zu Enum und EnumSet verwendet. Es ist sehr einfach, aber ich weiß nicht, wie Sie den folgenden Code EnumSet übersetzen:EnumSet 'und' 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 einfach ist, wie EnumSet.complementOf eingeben, aber ich sehe nicht, wie & tun.

Antwort

6

Sie wollen retainAll die Set Methode verwenden, um den Schnittpunkt von zwei Sätzen zu erhalten:

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); 
    } 
} 

Hinweis: Ich hatte vorher die folgende Zeile anstelle der einfacheren removeAll. Tom Hawtin wies darauf hin, dass removeAll einfacher ist und das gleiche Ziel erreicht. Ursprünglich habe ich die ursprüngliche Logik des OPs so genau wie möglich kopiert, ohne zu versuchen, sie zu optimieren.

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

Ich verwende retainAll ... der Test war falsch. Danke trotzdem :) – dfa

+0

Welcher Test war falsch? – Eddie

+0

ein Komponententest, hier nicht beigefügt – dfa

-2

CLASS_MODIFIERS, FIELD_MODIFIERS und METHOD_MODIFIERS könnten geeignet sein als Konstanten zu verlassen, da sie als bit masks verwendet werden. Der Link könnte helfen, den Sinn dieses Codes zu verdeutlichen.

+2

nein Ich möchte nicht mehr Bitmasken verwenden – dfa

+0

Der ganze Sinn dieses Posts ist es, von Bitmasken zu Enums/Enumsets zu wechseln – Ray