java.util.BitSet
代わりに使用してください。を処理するよりもはるかに高速ですboolean[]
。
また、これらの20boolean
が本当に必要かどうかを自問する必要がenum
あります。その場合EnumSet
は、Cのビットフィールド手法に対するJavaソリューションであるを使用できます(「効果的なJava 2nd Edition:EnumSet
ビットフィールドの代わりに使用」を参照)。
BitSet
int
変換へ/から
を使用BitSet
して削除するint
こともできますが、これらが必要な場合に備えて:
static BitSet toBitSet(int i) {
BitSet bs = new BitSet(Integer.SIZE);
for (int k = 0; k < Integer.SIZE; k++) {
if ((i & (1 << k)) != 0) {
bs.set(k);
}
}
return bs;
}
static int toInt(BitSet bs) {
int i = 0;
for (int pos = -1; (pos = bs.nextSetBit(pos+1)) != -1; ) {
i |= (1 << pos);
}
return i;
}
教育目的で、2つの異なる手法が意図的に使用されました。堅牢性を確保するために、BitSet
toint
変換では32ビットで十分であることを確認する必要があります。
EnumSet
例
この例は、本に記載されている例に基づいています。
import java.util.*;
public enum Style {
BOLD, ITALIC, UNDERLINE, STRIKETHROUGH;
public static void main(String[] args) {
Set<Style> s1 = EnumSet.of(BOLD, UNDERLINE);
System.out.println(s1); // prints "[BOLD, UNDERLINE]"
s1.addAll(EnumSet.of(ITALIC, UNDERLINE));
System.out.println(s1.contains(ITALIC)); // prints "true"
}
}
APIから:
この表現は非常にコンパクトで効率的です。このクラスの空間と時間のパフォーマンスは、従来のint
「ビットフラグ」に代わる高品質でタイプセーフな代替手段として使用できるほど十分に優れている必要があります。