
Javaのenumとは?基本から便利な使い方まで解説
avaの定数を一覧のように列挙することでenumと定義されます。
目次
enumとは?
enumとは列挙型と呼ばれるJavaの機能の一つです。プログラム実行中に変更されることのない値を定数と表現できますが、Javaでは定数を一覧のように列挙することでenumとして定義することができます。言葉で説明するだけではわかりにくいと思うので、サンプルプログラムを用意しました。
1 2 3 4 5 6 |
public class SampleProgram { public enum TeamMember { YAMADA, TANAKA, SATOU, } public static void main(String[] args) { System.out.println(TeamMember.YAMADA); } } |
チームメンバーをイメージしたenumです。3名のメンバーが列挙されています。このプログラムを実行すると標準出力に「YAMADA」と出力されます。Javaのenumは、このようにカンマ区切りで制限なく定数を列挙して宣言することができ、スコープの範囲内であれば自由に呼び出すことができます。
switch文でも型の恩恵を得られる
Javaのenumは以下のサンプルプログラムのようにswitch文に使用することもできます。このプログラムは、実行すると標準出力に「山田」と出力されます。スッキリ書けることはもちろん、Stringとは異なり予めenumとして定義した値のみcaseに書くことができるので、タイプミスなどのヒューマンエラーを防げることが強みです。
1 2 3 4 5 6 7 8 9 10 11 12 |
public static void main(String[] args) { TeamMember member = TeamMember.YAMADA; switch (member) { case YAMADA: System.out.println("山田"); break; case TANAKA: System.out.println("田中"); break; case SATOU: System.out.println("佐藤"); break; default: break; } } |
各標準メソッドの使い方をチェック
Javaのenumの基底クラスはEnumという抽象クラスです。このクラスには一般的なenumでよく使われるメソッドが標準で用意されています。これらのメソッドは、一見地味ながらも使いどころの多い便利なものです。使い方をチェックしていきましょう。
nameメソッド
nameメソッドはenumの名前をStringで返すメソッドです。下記のサンプルコードなら「YAMADA」と出力されます。このメソッドはあくまでenumの名前を返すメソッドなので、プログラマフレンドリな文字列を返すメソッドとしてはOverrideすることが可能なtoStringを使用しましょう。
1 |
System.out.println(TeamMember.YAMADA.name()); |
ordinalメソッド
ordinalメソッドはそのenumの列挙宣言での位置をintで返します。最初に列挙されたenumの位置は0であることに注意が必要です。宣言の順番に意味があるときに使用できますが、多くの場合、後述するフィールドの設定を用いた方が信頼性の高いコードを書くことができます。このメソッドはEnumSetやEnumMapなどのenumベースのデータ構造を用いるときに使用すると良いでしょう。
1 2 3 |
System.out.println(TeamMember.YAMADA.ordinal()); // 0 と出力される System.out.println(TeamMember.TANAKA.ordinal()); // 1 と出力される System.out.println(TeamMember.SATOU.ordinal()); // 2 と出力される |
compareToメソッド
compareToメソッドは引数に指定されたオブジェクトと比較を行うメソッドです。enumが指定されたオブジェクトよりも小さい場合は負の整数、同じ場合は0、大きい場合は正の整数を返します。この時の大小の比較はenumの宣言の順番をもとに行われます。
1 2 3 4 5 |
if (TeamMember.YAMADA.compareTo(TeamMember.TANAKA) < 0) { System.out.println("山田さんは田中さんよりも先に宣言されている"); // こちらの行が実行される } else { System.out.println("山田さんは田中さんよりも後に宣言されている"); } |
valueOfメソッド
valueOfメソッドは引数に指定された名前のenumを返すメソッドです。この後説明するvaluesメソッドと合わせて使用することでenumの名前とenumのマッピングを行うことができます。
1 |
System.out.println(TeamMember.valueOf("YAMADA")); // YAMADA と出力されるSystem.out.println(TeamMember.valueOf("TANAKA")); // TANAKA と出力されるSystem.out.println(TeamMember.valueOf("SATOU")); // SATOU と出力される |
valuesメソッド
valuesメソッドは、enumのすべての定数を宣言順に並べた配列を返します。以下のようにenumを宣言した順にループさせることができ、valueOfメソッドの説明で触れたようにenumの名前とenumのマッピングを行うときによく使用されます。
1 2 3 |
for (TeamMember member : TeamMember.values()) { System.out.println(member.name()); // YAMADA, TANAKA, SATOU と順に出力される } |
enumもクラス!メンバをフル活用してもっと便利に
一見するとenumはクラスとは別のものに見えるかもしれませんが、先ほども少し触れたとおり、JavaのenumはすべてEnumという抽象クラスを継承したものなのです。つまり、enumもJavaのクラスの1つです。一般的なクラスと同じように、メンバを定義することができます。サンプルプログラムとともに詳しく見ていきましょう。
フィールドやメソッドを定義してみよう
下記のサンプルプログラムでは、今まで扱ってきたTeamMemberにnameというフィールドを定義しています。このようにprivateなコンストラクタを用いてフィールドに値を設定できます。また、一般的なクラスと同じ記法でメソッドを定義することもでき、サンプルプログラムではgetNameメソッドを定義しています。このように、enumにメンバを定義することで、より便利にenumを使うことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class SampleProgram { public enum TeamMember { YAMADA("山田"), TANAKA("田中"), SATOU("佐藤"),; private final String name; private TeamMember(String name) { this.name = name; } public String getName() { return this.name; } } public static void main(String[] args) { for (TeamMember member : TeamMember.values()) { System.out.println(member.getName()); // 山田, 田中, 佐藤 と順に表示される } } } |
enumを積極的に使ってみよう
enumの使い方について理解できたでしょうか。まずは数十以内の定数群をenumとして定義して、標準メソッドだけでも積極的に使ってみましょう。コードの品質が上がることを実感できるはずです。慣れてきて自然にenumのフィールドやメソッドを活用できるようになったなら、enumの使い方はしっかりおさえられたと言えます。ぜひ、チャレンジしてみてください。