今回は、Enumの書き方と使い方をご紹介します。
今回扱うメインの言語はJavaですが、考え方自体は他の言語でも通用するので、言語の違いはあまり気にしなくてもよいです。
Enumのメリットを簡単に説明すると、”定数を一元管理して共通化することで変更が楽になる”ということです。
詳しくはこちらでご紹介しています。

Enumの書き方
Enumはあくまでも”型”なので、定義するときは型をenumにして定義します。今回は例として、国のEnumを定義します。
public enum Country { JAPAN, AMERICA, CHINA; }
これでEnumが定義出来ました。
Enumには、フィールド変数や関数も定義できます。
まず、フィールド変数として国に”連番ID”と”日本語の名前”と”英語の名前”を定義します。
続いて、定義されている”連番ID”と”日本語の名前”と”英語の名前”を取得する関数を定義します。
public enum Country { // Enumの名前(連番ID, 日本語の名前, 英語の名前) と記述します。 JAPAN(0, "日本", "Japane"), AMERICA(1, "アメリカ", "America"), CHINA(2, "中国", "China"); ); // フィールド変数 private final int id; // 連番ID private final String japaneseName; // 日本語の名前 private final String englishName; // 英語の名前 // コンストラクタ private Country(final int id, final String japaneseName, final String englishName) { this.id = id; this.japaneseName = japaneseName; this.englishName = englishName; } // 連番ID取得関数 public int getId() { return this.id; } // 日本語の名前取得関数 public String getJapaneseName() { return this.japaneseName; } // 英語の名前取得関数 public String getEnglishName() { return this.englishName; } }
一般的には、ここまで定義できれば大丈夫です。後は、使いやすいように必要な関数や定義を増やして使用します。
Enumの使い方
実際に定義したEnumの使い方をご紹介します。
ソースコードの中では、国は全て大文字の”JAPAN”や”AMERICA”として扱い、必要に応じて”JAPAN”に定義されている”連番ID”や”日本語の名前”、”英語の名前”を取得して使用します。
定義した値の取得
定義した値を使用するには、任意の定義から値取得用の関数を使用して取得します。
// 日本の連番IDを取得する場合 int id = Country.JAPAN.getId();
Enumを条件分岐として使う
定義したEnumは条件の比較として使われることも多いです。
例えば、国が日本なら日本語の名前を取得、それ以外なら英語の名前を取得する関数は以下のようになります。
// 国の名前を取得する関数(引数はCountry型を渡す) public String getNameOfCountry(Country country) { if (country == Country.JAPAN) { // 国が日本なら日本語の名前を返す return country.getJapaneseName(); } else { // 国が日本以外なら英語の名前を返す return country.getEnglishName(); } }
さらに、Switch文でもEnumを使うこともできます。
// 国の名前を取得する関数(引数はCountry型を渡す) public String getNameOfCountry(Country country) { switch (country) { case JAPAN: return country.getJapaneseName(); break; case AMERICA: return country.getEnglishName(); break; case CHINA: return country.getEnglishName(); } }
定義された値からEnumを逆引き
Enum定数からEnumを逆引きするには、valueOf関数を使用します。
例では、JAPANという文字列から一致する、EnumのJAPANを取得しています。
Country country = Country.valueOf("JAPAN");
また、Enumに次のような関数を定義することで、Enumで定義された値からEnumを逆引きすることも可能です。
この例では、連番IDを引数に取り、定義された連番IDのEnumを取得しています。
// 連番IDからEnumを取得する関数(引数は連番ID) public static Country valueOf(Integer id) { for (Country country : values()) { if (country.getId.equals(id)) { return country; } } }
Enumを使うタイミング
重要なのはここからです。
上記で、EnumからEnum定数を取得する方法と、定数からEnumを取得する方法をご紹介しました。
つまり、Enumさえ定義しておけば、いつでもEnumに変換することが出来るということです。
ソースコード上では、定数をそのまま扱うことは良いコードとは言えません。
そのため、ソースコード上では、定数は常にEnumとして扱いましょう。
変数定義は常にEnum型の変数を定義し、定数が必要な箇所でEnumから値を取得して使用します。
逆に、ユーザからの入力値やデータベースに格納されている値がEnumで定義された定数の場合は、一旦Enumを逆引きしてEnumに戻して扱いましょう。
このように、Enum以外では定数を一切記述しないようにすることで、全ての定数がEnum管理でき、変更に強いソースコードになります。
まとめ
今回は、Enumの書き方と使い方、使うタイミングについてご紹介しました。
Enumは条件分岐などで使われることが多く、また、Enumから定数を呼び出すだけでなく、Enumで定義した定数からEnumを逆引きすることも可能です。
ソースコード中に定数を直接書かずに、全てEnumで管理することで、定数の値を修正するような場合でもEnumで定義された一箇所だけの修正で済みます。
これを徹底することで、修正が簡単になるため変更に強いソースコードに一歩近づきます。
変更に強いソースコードの重要性については、こちらの記事でご紹介しています。他にも、重要なテクニックを紹介しているので、合わせて読むことをオススメします。
