INTRODUCTION
enumって、結局何なのか。
Javaを勉強していると、
enumというものが出てきます。
例えば、こんなコードです。
public enum OrderStatus {
NEW,
PROCESSING,
SHIPPED,
COMPLETED
}
初めて見ると、 「定数をまとめているだけ?」 と思うかもしれません。
実際、それだけでも間違いではありません。
ただ、enumを理解するうえで重要なのは、 書き方を暗記することではありません。
enumは、 「この項目には、こういう値しか存在しない」 ということを表現するための仕組みです。
CONCEPT
enumを理解すると、
「属性」と「値」が見えてくる。
enumを学ぶと、 Javaの文法を一つ覚えるだけではありません。
業務システムに登場するデータを見たときに、 「これは何を表す項目なのか」 「この項目には、どんな値が入るのか」 と考えられるようになります。
例えば「注文状態」という属性があった場合、 その値には「受付」「処理中」「発送済み」「完了」 など、決められた状態があります。
注文
│
├─ 注文番号
├─ 顧客
├─ 注文日
└─ 注文状態
│
├─ NEW
├─ PROCESSING
├─ SHIPPED
└─ COMPLETED
このように、 属性が何を表し、 その属性がどのような値を取り得るのか を考えることは、 業務システムを理解するうえで重要です。
enumは、その「取り得る値」を Javaの中で明確に表現するための仕組みの一つです。
PROBLEM
文字列でも書けるのに、
なぜenumが必要なのか。
例えば注文状態を
Stringで管理するとします。
String status = "NEW";
これなら簡単です。
ところが、
Stringには
「何を入れてもいい」という問題があります。
String status = "NEW";
String status = "PROCESSING";
String status = "SHIPPED";
String status = "ABC";
Javaから見ると、
最後の "ABC" も
ただの文字列です。
「注文状態として正しい値なのか」 というルールを、 Stringそのものは保証してくれません。
ENUM
enumなら、取り得る値を定義できる。
そこでenumを使います。
public enum OrderStatus {
NEW,
PROCESSING,
SHIPPED,
COMPLETED
}
これで
OrderStatus
という型を作ることができます。
OrderStatus status;
status = OrderStatus.NEW;
ここで重要なのは、
statusが
単なる文字列ではなくなったことです。
OrderStatusとして
どのような値が存在するのかが、
enumの定義を見ることで分かります。
TYPE
enumは「値の一覧」ではなく、
「型」として考える。
enumを理解するときに、 もう一つ重要なのが 「型」という考え方です。
例えば、
Stringは文字列を扱う型です。
String name = "Taro";
intなら整数です。
int age = 30;
そしてenumも、 Javaでは一つの型として扱われます。
OrderStatus status;
status = OrderStatus.NEW;
つまり、 「注文状態」という業務上の概念そのものを Javaの型として表現している、 と考えることができます。
enumは、 「決められた値を持つ型」を作る仕組み。
BUSINESS SYSTEM
業務システムでは、
enumの考え方がいたるところに出てくる。
業務システムには、 「取り得る値がある程度決まっている項目」が たくさん登場します。
注文状態
NEW
PROCESSING
SHIPPED
COMPLETED
支払方法
CASH
CARD
TRANSFER
ユーザー権限
ADMIN
USER
GUEST
これらはすべて、 「属性」と「その属性が取り得る値」 という関係で見ることができます。
Javaのenumを理解しておくと、 DBのカラムやJSONの項目を見たときにも、 「この項目は何を表しているのか」 「どんな値が入るのか」 と考えやすくなります。
JSON
JSONを見るときにも、
「属性と値」の考え方が役立つ。
APIなどで扱うJSONにも、 同じ考え方が出てきます。
{
"orderId": "A001",
"customerName": "山田太郎",
"status": "SHIPPED"
}
ここでは、
statusが属性です。
そして
"SHIPPED"
がその値です。
status → 注文状態という属性
SHIPPED → その属性が持っている値
enumを学んでいると、 このようなJSONを見たときにも 「項目」と「その値」を分けて考えやすくなります。
DATABASE
DBのカラムを見るときも同じ。
例えば注文テーブルに
statusというカラムがあるとします。
orders
order_id
customer_id
order_date
status
このとき、
statusは
「注文状態」という属性です。
実際のデータには、 例えば次のような値が入ります。
order_id status
-------------------------
A001 NEW
A002 SHIPPED
A003 COMPLETED
Javaのenumを理解すると、 こうしたデータ構造を見たときに、 「これは何の属性で、 どんな値を持つのか」 という視点を持ちやすくなります。
IMPORTANT
ただし、enumがすべてを解決するわけではない。
ここは実際の業務システムを見るうえで 重要なポイントです。
Java側でenumを定義したからといって、 DBや外部システムまで自動的に 同じルールになるわけではありません。
例えば、
Javaでは
SHIPPED
と定義されていても、
DBでは別のコードを使っている場合があります。
Java
SHIPPED
DB
03
API
"SHIPPED"
このような場合には、 Java、DB、APIの間で 値を変換する処理が必要になります。
実際の業務システムでは、 「Javaのenumを見ればすべて分かる」 とは限りません。 システムごとにコード体系や データ変換のルールが存在します。
FIELD NOTE
enumを覚えることより、
「何の値なのか」を考える。
Javaを書いていると、 enumの書き方そのものを 覚えようとしてしまいます。
でも業務システムを読むときに重要なのは、 その値が何を意味しているのかです。
「statusって何の属性?」 「この値には何が入る?」 「なぜこの値しか存在しない?」
こうした疑問を持てるようになると、 Javaのコードだけではなく、 DBやJSON、APIのデータも 少しずつ読みやすくなっていきます。