この記事の要点
- Enumは、いくつかの定数を1つにまとめて管理したい時に使う
- 列挙型で条件分岐を行う際はswitch文を使う方が楽に書ける
- Enum内にフィールドやコンストラクタを定義すると、列挙子の値を自由に設定できる
以前、Javaの特徴やJavaを利用した有名なサービスなど、Javaの基礎について解説していました。
Javaでは、複数の定数をまとめて管理するために、Enumが提供されています。
使えると定数の定義がすっきり書ける、定数の意味がわかりやすくなるなどのメリットがありますが、やや使い方に癖があります。
当記事では、Enumの基本的な使い方をご紹介します。
Enumを使ったことがない方や、使い方に自信のない方向けに、丁寧に解説しています。
目次
JavaのEnumとは
Enum(イーナム)とは、列挙型と呼ばれる特殊なクラスです。
正体はクラスなのですが、使い方はかなり独特なので、別物として覚えてしまう方がよいでしょう。
どのような時に使われるか
Enumは、いくつかの定数を1つにまとめて管理したい時に使います。
例えば、信号機の色は「赤」「黄」「青」の三色で一組ですよね。
これを別々の定数で定義すると、次のようになります。
public class Main { public static final int RED = 0; public static final int YELLOW = 1; public static final int BLUE = 2; public static void main(String[] args) { int color = RED; switch(color){ case RED: System.out.println("止まれ"); break; case YELLOW: System.out.println("安全に止まれるなら止まれ"); break; case BLUE: System.out.println("進んでも良い"); break; } } }
これでも悪くはないのですが、Enumを使うともっとすっきり整理できます。
Enumを使ったサンプルはこちらです。
public class Main { enum Signal{ RED, YELLOW, BLUE; } public static void main(String[] args) { Signal color = Signal.RED; switch(color){ case RED: System.out.println("止まれ"); break; case YELLOW: System.out.println("安全に止まれるなら止まれ"); break; case BLUE: System.out.println("進んでも良い"); break; } } }
定数よりEnumを使う方が定義がすっきりしているし、利用するときも「Signal.RED」のようになるので、信号機の色を表していることが伝わりやすいです。
さらに、定数の場合は「うっかりREDとBLUEの値を同じにしてしまった」ということがあり得ますが、Enumは自動で連番を振ってくれるのでその心配もありません。
このように、複数で1つの物事を表す定数を定義する際は、Enumを使うとメリットが多いです。
Enumの基本的な使い方
Enumを定義する際の構文は以下の通りです。
(アクセス修飾子) enum 列挙型名{ 列挙子名1, 列挙子名2, … 列挙子名n; }
利用するときは、クラス変数にアクセスするときと同じように、
列挙型名.列挙子名
のようにします。
switch文での使い方
先ほどの例を再掲します。
Signal color = Signal.RED; switch(color){ case RED: System.out.println("止まれ"); break; case YELLOW: System.out.println("安全に止まれるなら止まれ"); break; case BLUE: System.out.println("進んでも良い"); break; }
switch文で使う際は、switchの()内にEnumの値を指定し、
caseラベルには各列挙子名を指定します。
このサンプルでは、colorにはSignal.REDが指定されているので、"止まれ"が出力されます。
if文での使い方
先ほどの例を、if文で記載してみます。
Signal color = Signal.RED; if(color == Signal.RED){ System.out.println("止まれ"); }else if(color == Signal.YELLOW){ System.out.println("安全に止まれるなら止まれ"); }else if(color == Signal.BLUE){ System.out.println("進んでも良い"); }
Enumは、「==」で比較できます。
ただ、毎回「Signal.RED」のように書かなければならないので、列挙型で条件分岐を行う際はswitch文を使う方が楽に書けます。
Enumメソッドの使い方
Enumには専用のメソッドが用意されているので、一部をご紹介します。
使う機会は少ないかもしれませんが、存在は知っておいて損はありません。
戻り値 | メソッド | 説明 |
---|---|---|
static <T extends Enum>T | valueOf(String name) | 引数に列挙型内の列挙子名を指定すると、その列挙型を返す。 |
int | ordinal() | その列挙型が定義された順番(先頭は0)を返す。 |
static T[] | values() | その列挙型が持つ全ての列挙子の値を配列で返す。 |
サンプルコードはこちらです。
// valueOf Signal red = Signal.valueOf("RED"); System.out.println("redの値は" + red); Signal yellow = Signal.YELLOW; // ordinal System.out.println("YELLOWの定義された順番は" + yellow.ordinal()); // values Signal[] array = Signal.values(); for(int i = 0; i < array.length; i++){ System.out.println("Signalの中身の" + i + "番目は" + array[i]); }
サンプルの実行結果は以下の通りです。
redの値はRED YELLOWの定義された順番は1 Signalの中身の0番目はRED Signalの中身の1番目はYELLOW Signalの中身の2番目はBLUE
Enumを使う際の注意点
Enumを使う際は、次のことに気を付けましょう。
Enumはnewでインスタンス生成できない
Enumは、プログラム実行時の一度だけ、自動的にインスタンス生成されます。
任意のタイミングでnewによってインスタンス生成はできないので、覚えておきましょう。
列挙子に任意の値を設定することもできるが、やや難しい
各列挙子に連番以外の値を設定したい場合は、クラスと同じように、Enum内にフィールドやコンストラクタを定義する必要があります。
ややこしい上にたまにしか使わないので、慣れるまでは覚えなくてOKです。
enum Signal{ RED("赤"), YELLOW("黄"), BLUE("青"); private final String color; private Signal(String color){ this.color = color; } }
まとめ
Enumの使い方についてご紹介しました。
Enumはやや使い方が独特なこともあり、初心者の方には避けられがちです。
しかし、定数を1つ1つ定義するよりもすっきりコーディングできるし、メンテナンスもしやすくなるので、Javaでのプログラミングに慣れてきたタイミングで習得しておくとよいでしょう。
ただし、完璧に理解しようとするとかなりややこしい仕様となっています。
まずは使い方を暗記しておくくらいでも十分実践で役に立ちます。
また、Javaでの開発を進めていく中で、もっと効率的に開発したいと思っている方はIDE(統合開発環境)を使うのがおすすめです。
面倒な環境構築作業が簡略化でき、コーディングから実行、デバッグまでを1つのソフトで完結できるからです。
IDEの便利な機能や、Java開発におすすめのIDEをご紹介していますので参考にしてください。