enumって、結局何なのか。

Javaを勉強していると、 enumというものが出てきます。

例えば、こんなコードです。

public enum OrderStatus {

    NEW,
    PROCESSING,
    SHIPPED,
    COMPLETED

}

初めて見ると、 「定数をまとめているだけ?」 と思うかもしれません。

実際、それだけでも間違いではありません。

ただ、enumを理解するうえで重要なのは、 書き方を暗記することではありません。

enumは、 「この項目には、こういう値しか存在しない」 ということを表現するための仕組みです。

enumを理解すると、
「属性」と「値」が見えてくる。

enumを学ぶと、 Javaの文法を一つ覚えるだけではありません。

業務システムに登場するデータを見たときに、 「これは何を表す項目なのか」 「この項目には、どんな値が入るのか」 と考えられるようになります。

ATTRIBUTE × VALUE

例えば「注文状態」という属性があった場合、 その値には「受付」「処理中」「発送済み」「完了」 など、決められた状態があります。

注文
│
├─ 注文番号
├─ 顧客
├─ 注文日
└─ 注文状態
      │
      ├─ NEW
      ├─ PROCESSING
      ├─ SHIPPED
      └─ COMPLETED

このように、 属性が何を表し、 その属性がどのような値を取り得るのか を考えることは、 業務システムを理解するうえで重要です。

enumは、その「取り得る値」を Javaの中で明確に表現するための仕組みの一つです。

文字列でも書けるのに、
なぜenumが必要なのか。

例えば注文状態を Stringで管理するとします。

String status = "NEW";

これなら簡単です。

ところが、 Stringには 「何を入れてもいい」という問題があります。

String status = "NEW";

String status = "PROCESSING";

String status = "SHIPPED";

String status = "ABC";

Javaから見ると、 最後の "ABC" も ただの文字列です。

POINT

「注文状態として正しい値なのか」 というルールを、 Stringそのものは保証してくれません。

enumなら、取り得る値を定義できる。

そこでenumを使います。

public enum OrderStatus {

    NEW,
    PROCESSING,
    SHIPPED,
    COMPLETED

}

これで OrderStatus という型を作ることができます。

OrderStatus status;

status = OrderStatus.NEW;

ここで重要なのは、 statusが 単なる文字列ではなくなったことです。

OrderStatusとして どのような値が存在するのかが、 enumの定義を見ることで分かります。

String 自由な文字列
enum 定義された値

enumは「値の一覧」ではなく、
「型」として考える。

enumを理解するときに、 もう一つ重要なのが 「型」という考え方です。

例えば、 Stringは文字列を扱う型です。

String name = "Taro";

intなら整数です。

int age = 30;

そしてenumも、 Javaでは一つの型として扱われます。

OrderStatus status;

status = OrderStatus.NEW;

つまり、 「注文状態」という業務上の概念そのものを Javaの型として表現している、 と考えることができます。

enumは、 「決められた値を持つ型」を作る仕組み。

業務システムでは、
enumの考え方がいたるところに出てくる。

業務システムには、 「取り得る値がある程度決まっている項目」が たくさん登場します。

注文状態
    NEW
    PROCESSING
    SHIPPED
    COMPLETED

支払方法
    CASH
    CARD
    TRANSFER

ユーザー権限
    ADMIN
    USER
    GUEST

これらはすべて、 「属性」と「その属性が取り得る値」 という関係で見ることができます。

Javaのenumを理解しておくと、 DBのカラムやJSONの項目を見たときにも、 「この項目は何を表しているのか」 「どんな値が入るのか」 と考えやすくなります。

JSONを見るときにも、
「属性と値」の考え方が役立つ。

APIなどで扱うJSONにも、 同じ考え方が出てきます。

{
    "orderId": "A001",
    "customerName": "山田太郎",
    "status": "SHIPPED"
}

ここでは、 statusが属性です。

そして "SHIPPED" がその値です。

ATTRIBUTE / VALUE

status → 注文状態という属性

SHIPPED → その属性が持っている値

enumを学んでいると、 このようなJSONを見たときにも 「項目」と「その値」を分けて考えやすくなります。

DBのカラムを見るときも同じ。

例えば注文テーブルに statusというカラムがあるとします。

orders

order_id
customer_id
order_date
status

このとき、 statusは 「注文状態」という属性です。

実際のデータには、 例えば次のような値が入ります。

order_id    status
-------------------------
A001        NEW
A002        SHIPPED
A003        COMPLETED

Javaのenumを理解すると、 こうしたデータ構造を見たときに、 「これは何の属性で、 どんな値を持つのか」 という視点を持ちやすくなります。

ただし、enumがすべてを解決するわけではない。

ここは実際の業務システムを見るうえで 重要なポイントです。

Java側でenumを定義したからといって、 DBや外部システムまで自動的に 同じルールになるわけではありません。

例えば、 Javaでは SHIPPED と定義されていても、 DBでは別のコードを使っている場合があります。

Java

SHIPPED


DB

03


API

"SHIPPED"

このような場合には、 Java、DB、APIの間で 値を変換する処理が必要になります。

FIELD NOTE

実際の業務システムでは、 「Javaのenumを見ればすべて分かる」 とは限りません。 システムごとにコード体系や データ変換のルールが存在します。

enumを覚えることより、
「何の値なのか」を考える。

Javaを書いていると、 enumの書き方そのものを 覚えようとしてしまいます。

でも業務システムを読むときに重要なのは、 その値が何を意味しているのかです。

「statusって何の属性?」 「この値には何が入る?」 「なぜこの値しか存在しない?」

こうした疑問を持てるようになると、 Javaのコードだけではなく、 DBやJSON、APIのデータも 少しずつ読みやすくなっていきます。