アイテムビットフィールドではなくEnumSetの使用


アイテムビットフィールドではなくEnumSetの使用
リストされた値が単独で使用されていないセットの場合、整数列挙モードを使用して、定数ごとに異なる2つの繰返し平方値を以前は割り当てていました.
ビットドメインは定数を列挙します-古い手法!
public class Text {
    public static final int STYLE_BOLD = 1 << 0; // 1
    public static final int STYLE_ITALIC = 1 << 1; // 2
    public static final int STYLE_UNDERLINE = 1 << 2; // 4
    public static final int STYLE_STRIKETHROUGH = 1 << 3; // 8

    // 매개변수 styles는 0개 이상의 STYLE_ 상수를 비트별 OR한 값이다.
    public void applyStyles(int styles) {
        // ...
    }
}
  • は、以下に示すビットORを用いて複数の定数を1つのセットに集約することができる.
  • のように作成されたセットをビットフィールド(bitfield)と呼ぶ.
  • public class Item36 {
        public static void main(String[] args) {
            text.applyStyles(STYLE_BOLD | STYLE_ITALIC);
        }
    }
  • ビットフィールドを使用すると、パラレルセットや交差など、ビット単位の演算を使用して効率的に集合演算を実行できます.
  • ビットフィールドは、整数列挙定数の欠点を保持する.
  • さらに
  • を加えると、ビットフィールド値がそのまま出力されると、単純な整数列挙定数を出力する場合よりも解釈しにくい.
  • ビートルズバンドのすべての要素を巡回するのも難しい.
  • 最後に、APIを記述する際に、適切なタイプ(通常intまたはlong)を選択するために、最大何ビットが必要かを事前に予測する必要がある.APIを変更しないと、ビット数(32ビットまたは64ビット)を増やすことはできません.
    なぜなら.
  • EnumSetビットフィールドに代わる現代技術
    public class Text {
        public enum Style {BOLD, ITALIC, UNDERLINE, STRIKETHROUGH}
    
        // 어떤 Set을 넘겨도 되나, EnumSet이 가장 좋다.
        public void applyStyle(Set<Style> styles) {
            // ...
        }
    }
    EnumSetクラスは、
  • ビットフィールドよりも優れた代替案です.
  • java.utilパケットのEnumSetクラスは、列挙型定数の値からなる集合を効率的に表す.
  • 完全な
  • Setインタフェースで、タイプは安全で、他の任意のSetインプリメンテーションと一緒に使用できます.
  • しかし、EnumSetの内部はビットベクトルによって実現される.要素の合計数が64個未満の場合、ほとんどの場合、EnumSet全体をlong変数として表し、ビットフィールドと比較したパフォーマンスを表示できます.
  • removeAllやreserveAllのような多くのタスクは、ビットフィールドを使用する場合に使用されるのと同様に、ビットを有効に処理する算術演算を使用することによって実現される.
  • の困難な作業はすべてEnumSetによって処理されるので、ビットを直接処理する際に発生するよくあるエラーから解放される.
  • public class Item36 {
        public static void main(String[] args) {
            text.applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
        }
    }
  • ApplysStyles法がEnumSet<Style>ではなくSet<Style>を得る理由は多形性である.
  • すべてのクライアントはEnumSetを配信できますが、通常はインタフェースとして受信するのが良い習慣です.
  • のように、一部の特殊なクライアントが他のSet実装を超えていても、処理することができる.
  • コアの整理
    リスト可能な
  • タイプを組み合わせてセット形式で使用しても、ビットフィールドを使用する理由はありません.
  • EnumSetクラスは、ビットフィールドレベルの解像度とパフォーマンス、および列挙タイプの利点を提供します.
  • EnumSetの唯一の欠点はjava 9まで不変のEnumSetを作成できないことです(java 11まで変更されていません).
  • 明確性と性能は犠牲になったが,集合はEnumSetに代わった.EnumSetを囲むにはunmodifiableSetを使用します.