Można użyć EnumSet również. Pozwala to na używanie nazwanych bitów i może być bardziej przyjazne niż przy użyciu BitSet, który używa indeksowanych bitów.
Specjalistyczna implementacja zestawu do użytku z typami wyliczeniowymi. Wszystkie elementy w zestawie enum muszą pochodzić z pojedynczego typu wyliczeniowego, który jest określony, jawnie lub niejawnie, podczas tworzenia zestawu. Zestawy enum są reprezentowane wewnętrznie jako wektory bitowe. Ta reprezentacja jest niezwykle kompaktowa i wydajna. Wydajność w czasie i przestrzeni tej klasy powinna być wystarczająco dobra, aby umożliwić jej użycie jako wysokiej jakości, bezpiecznej dla zdrowia alternatywy dla tradycyjnych "bitowych flag" opartych na int. Nawet operacje masowe (takie jak containsAll i retainAll) powinny działać bardzo szybko, jeśli ich argument jest również zbiorem enum.
np.
BitSet bs = new BitSet(4);
bs.set(1); // READY
bs.set(3); // LARGE_FLAG
boolean largeFlag = bs.get(1); // LARGE_FLAG
System.out.println("Using BitSet: "+bs);
EnumSet<Settings> settings = EnumSet.noneOf(Settings.class);
settings.add(Settings.READY);
settings.add(Settings.LARGE_FLAG);
boolean largeFlag2 = settings.contains(Settings.LARGE_FLAG);
System.out.println("Using EnumSet: "+settings);
drukuje
Using BitSet: {1, 3}
Using EnumSet: [READY, LARGE_FLAG]
IMHO EnumSet jest znacznie wyraźniejszy, jeśli jego właściwe.
[java.util.BitSet] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)? Czy może czegoś brakuje? – Mysticial
Geez ... Powinienem przestać się zastanawiać i opublikować te odpowiedzi ... – Mysticial
@Mysticial: Bądź nieco bardziej niezdecydowany z wahaniem. ;) – Mehrdad