🧭 EnumSetとは?
EnumSet は 列挙型(enum) の値だけを要素として持てる、Java専用のセットコレクションです。HashSet<Enum> などでも同様のことはできますが、EnumSet は内部で ビット演算 を使って管理されているため、
-
メモリ消費が少ない
-
追加・検索・削除が高速
-
enum 型専用で型安全
というメリットがあります。
特に、「状態フラグ」や「権限管理」 を enum で扱う場合、EnumSet は非常に相性が良いです。
🚀 基本的な使い方
まずは最低限の使用例です。
🛠️ EnumSetの生成方法一覧(よく使うやつだけ)
| メソッド | 説明 |
|---|---|
| EnumSet.of(...) | 指定した要素のみを持つセット |
| EnumSet.allOf(Enum.class) | enumのすべての値をセット |
| EnumSet.noneOf(Enum.class) | 空セット(後から追加前提) |
| EnumSet.range(START, END) | enumの範囲を指定して生成 |
| EnumSet.complementOf(set) | 指定セットの補集合を生成 |
例:
💡 実務例1:状態管理(アプリの画面状態)
ポイント
-
シンプルな boolean フラグ乱立より、enum + EnumSetの方が保守しやすくなる
🔐 実務例2:アクセス権限の判定
メリット
| 比較対象 | 弱点 | EnumSet に置き換えたメリット |
|---|---|---|
| boolean canEdit, canDelete の乱立 | フラグ増えると混乱 | Enumが増えても整理される |
| List | 検索遅い/重い | contains が高速 |
| int ビットフラグ | 可読性が最悪 | Enumで意味が明確 |
⚙️ EnumSet の注意点
| 注意点 | 内容 |
|---|---|
| enum 以外入らない | 型安全なので逆に柔軟性は低め |
| スレッドセーフではない | 必要なら Collections.synchronizedSet(set) が必要 |
| 継承不可 | HashSet の代替として常に使えるわけではない |
🎯 まとめ
EnumSet は 「booleanフラグが増えてきた」「enum の組み合わせを扱いたい」 という状況で非常に役立ちます。
🔍 使うべきシーン
-
UI状態・処理ステータスの分類
-
権限管理(READ / WRITE / EXECUTE など)
-
設定フラグや制御モード
✔ 結論
Enum を「組み合わせて扱う」なら必ず EnumSet を選択すべき。
軽量・高速・安全で、Javaの設計思想にもぴったり沿ったコレクションです。
