【れっきょがた】

列挙型(Enum) とは?

💡 選べる選択肢が決まった「自動販売機のボタン」
📌 このページのポイント
列挙型(enum):名前付き定数の集合 enum Color RED = 0 GREEN = 1 BLUE = 2 マジックナンバー(悪い例) if (color == 0) // 赤? if (color == 1) // 緑? 数字だけでは意味が不明… バグの温床になりやすい enumのメリット ✓ コードが読みやすい ✓ 入力ミスを防止 ✓ 値の範囲を制限
列挙型のイメージ
ひよこ ひよこ

普通の変数に文字列を入れるのとどう違うの?

ペンギン先生 ペンギン先生

status = "acitve" とタイプミスしても文字列なら気づかない。Enumなら Status.Active のように定義された選択肢しか使えないので、タイプミスはコンパイルエラーで即座にわかる。安全装置つきの選択肢リスト。

ひよこ ひよこ

JavaScriptにはEnumがないの?

ペンギン先生 ペンギン先生

JavaScript自体にはEnum構文がない。代わりに const STATUS = Object.freeze({ ACTIVE: "active", INACTIVE: "inactive" }) のようにオブジェクトで代用する。TypeScriptなら enum キーワードが使える。

ひよこ ひよこ

数値enumと文字列enumどっちがいい?

ペンギン先生 ペンギン先生

文字列enumのほうがおすすめ。デバッグ時にコンソールで "ACTIVE" と表示されたほうが 0 より意味がわかりやすい。数値enumは値を省略できて楽だけど、意図しない数値比較が起きるリスクがある。

ひよこ ひよこ

Enumに振る舞いを持たせることもできるの?

ペンギン先生 ペンギン先生

JavaKotlinではEnumにメソッドやフィールドを追加できるよ。たとえばHTTPステータスコードのEnumに「isSuccess()」メソッドを追加して、200番台かどうかを判定させるとか。ただしTypeScriptのenumにはメソッドを追加できないから、classで代用する場合もあるんだ。

ひよこ ひよこ

Enumの値が増えたらどう管理するの?

ペンギン先生 ペンギン先生

DBに保存している場合は要注意だよ。Enumの値を後から削除すると、古いデータとの不整合が起きる。だから「DEPRECATED_旧値」のように残しておく運用が安全。あと、switch文でEnumの全パターンをカバーしているか確認する「網羅性チェック」をコンパイラに任せると、値を追加したとき対応漏れを自動検知できるからおすすめだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
Enumって出てきたら「選べる値をあらかじめ決めておく型」と思えばだいたいOK!
📖 おまけ:英語の意味
「enumeration」 = 列挙、一覧
💬 ラテン語の「enumerare(数え上げる)」が語源で、値を一つずつ列挙することから
← 用語集にもどる