Javaに限らずですが、わからないことを調べようとしてネット検索をしても、あと少しのところで「そうじゃない…そうじゃないんだよ」ってこと、結構ありませんか?スクリプトをバリバリ組める人が書けば書くほど無意識のうちに説明を端折っている場合が凄く多い気がします。本当に初心者の方(といっても最低限Javaの使い方や基本中の基本は他所で勉強してきてくださいね)が見ても納得のいく説明をしてくれてる親切なサイトって実は凄く貴重なんです。
本記事ではEnum(列挙型)についての解説をしていきます。因みに列挙型っていうのはEnumの名称定義です。これをみて「あーなるほど。そういうことだったのか」くらいは思ってもらえると非常に嬉しく思います。
- 複数の定数(列挙子)をまとめて管理できる。
- 定数が変更されるたびに書き換える必要が有る。
- 列挙子に値を付与する場合、フィールドとコンストラクタを定義する必要が有る。
- コンストラクタのアクセス修飾子はprivateのみ可能。
列挙型:定義
Enum(列挙型)の定義は以下の通りとなります。
修飾子 enum 型名 { 識別子1, 識別子2, ... }
それでは早速サンプルコードで確認してみましょう。
public class Main { public static void main(String[] args) { Kotoba tango = Kotoba.Hoge; // Enumを取得 System.out.println(tango); // Hogeを出力 } // 列挙子の定義 protected enum Kotoba { Hoge, Fuga }; }
実行結果
Hoge
まずは基本形の定義です。ここではKotobaを定義しています。またKotobaを使用する為にオブジェクト宣言が必要になるため、オブジェクトとしてtangoを宣言しています。
宣言したオブジェクトに列挙子が格納されますので、結果としてHogeが出力されます。Enumが保持している定数(列挙子)のみを取得する為、他の文字列が出力されることはありません。これがEnumのメリットでもあります。
Switch文
次はSwitch文で使う場合の説明です。
Switch文についてもJava7からは記述が簡潔になりました。簡単に見てみましょう。
public class Main { public static void main(String[] args) { Kotoba tango = Kotoba.Hoge; // Enumを取得 switch(tango) { case Hoge: System.out.println("ほげ"); // 条件"Hoge"出力 break; case Fuga: System.out.println("ふが"); // 条件"Fuga"出力 break; } } // 列挙子の定義 protected enum Kotoba { Hoge, Fuga }; }
実行結果
ほげ
組み合わせて使う
Enumは複数の型を組み合わせて使うことも出来ます。
public class Main { public static void main(String[] args) { Kotoba tango = Kotoba.Fuga; // Enumを取得 System.out.println(tango.getId()); System.out.println(tango.getMoji()); } // 列挙子の定義 protected enum Kotoba { Hoge(1, "ほげ"), Fuga(2, "ふが"); private int id; private String moji; /* メンバ変数を定義している場合、修飾子は必ずprivateであることに注意してください。 これ以外のアクセス修飾子にしてしまうとコンパイルエラーとなります。 */ private Kotoba(int id, String moji) { // コンストラクタの呼び出し this.id = id; this.moji = moji; } public int getId() { return id; } public String getMoji() { return moji; } }; }
実行結果
2 ふが
列挙子のフィールドに「Hoge」「Fuga」をそれぞれ設定し、同時にコンストラクタの実装、それからメソッドを追加しています。
このように複数の値を設定することも可能です。
メソッドの使い方
Enumには予め用意されたいくつかのメソッドがありますが、その一つである「valueOf」について説明していきます。
valueOfメソッド
enumのvalueOfは引数で渡した文字列から列挙子名を取得するときに使います。早速サンプルコードを見てみましょう。
public static void main(String[] args) { Kotoba hoge = Kotoba.valueOf("Hoge"); System.out.println(hoge.getMoji()); }
実行結果
ほげ
このコードでは”Hoge”という文字列で”Kotoba”という型名に参照をかけています。
今回は合致する列挙子があったため、列挙子に予め定義したString型のフィールドが返ってきています。
一致する列挙子が無い場合にはIllegalArgumentExceptionが返ってきます。
Enumを使う場合の注意
列挙型はクラスの一種と考えてください。上でも簡単にコードを書きましたが、フィールドやコンストラクタも定義することが出来ます。
またコンストラクタを定義することで初期値にint型やString型を設定することも可能です。
初期値を設定する場合にはフィールドの定義を忘れないようにしてください。
public enum Kotoba { Hoge(1, "ほげ"), Fuga(2, "ふが"); //フィールドの定義 private int id; private String moji; // コンストラクタの定義 private Kotoba(int id, String moji) { this.id = id; this.moji = moji; } // メソッドの呼び出し public int getId() { return id; } //メソッドの追加 public String getMoji() { return moji; } };
なおコンストラクタを定義する場合にはアクセス修飾子はprivateのみ使用可能となることに注意してください。
また、フィールドの定義やコンストラクタ処理を記述しない場合にはコンパイルエラーが発生します。
値を設定するときには、フィールド、コンストラクタ、メソッドを一つのセットとして記述することを覚えておきましょう。
まとめ
今回はEnum(列挙型)についてご説明しましたが、初心者の方にも恐らく十分に理解いただける内容となっているはずです。
プログラミングを始めたくても、いきなりわからないことだらけでネットを見ても十分な説明が無い場合、本当に嫌になりすぐに投げ出してしまいますよね。
こうやってひも解いて考えていけば意外とプログラミングって簡単なんだって思える部分も多いと思います。
これを機会に是非本格的に勉強していきましょう。
valueOfメソッド以外にも予め用意されているメソッドがありますが、そのメソッドのうちのいくつかを紹介します。
values()
定義した列挙子を定義された順に全て返す
toString()
宣言した文字列を取得する
ordinal()
定義された列挙子の順番を返す