こんにちは!フリーランスのオータケです。皆さんはJavaでEnumを使っていますか?そしてEnum(列挙型)を使いこなせていますか?
Enumには定数を定義して使うだけでなく、フィールドを定義したりメソッドを定義して使うことができます!
この記事では、Enumについて
- Enumについて
- Enumのメソッドの使い方
という基本的な内容から、Enumクラスの使い方などの応用的な使い方に関しても解説していきます。今回はEnumについて、わかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
Enumについて
Enum(列挙型)とは、複数の定数をひとつにまとめておくことができる型のことです。Enumで定義する定数のことを列挙子と呼びます。
C言語でも列挙型は使われ、定義の方法は似ている部分がありますが、Javaの列挙型はクラスですので、フィールドやメソッドを定義することができます。
switch文で列挙子を使用することで、読みやすさ(可読性)が向上することなどがEnumを使うメリットになります。
定義について
Enumの定義は以下のように記述します。
アクセス修飾子 enum 列挙名 {列挙子1, 列挙子2, ・・・};
サンプルコードで確認しましょう。
public class Main { public static void main(String[] args) { Fruit fruit_type = Fruit.Orange; System.out.println(fruit_type); } protected enum Fruit { Orange, Apple, Melon }; }
実行結果:
Orange
このサンプルコードでは、列挙型のFruitを定義しています。Fruitを使用するには普通のクラスと同じようにオブジェクトを宣言します。ここではfruit_typeを宣言しています。
宣言したオブジェクトにEnumの列挙子を格納して、オブジェクトを使用することができるようになります。
switch文での使い方
Java6以前の環境では、switch文でString型を指定できなかったので、enumを使って記述を工夫する必要がありました。Java7からは指定できるようになりましたので、記述が簡潔になりました。
サンプルコードで確認しましょう。
public class Main { public static void main(String[] args) { Fruit fruit_type = Fruit.Orange; switch(fruit_type) { case Orange: System.out.println("おいしいみかん"); break; case Apple: System.out.println("りんごたべたい"); break; case Melon: System.out.println("メロンがすべて"); break; } } protected enum Fruit { Orange, Apple, Melon }; }
実行結果:
おいしいみかん
Enumのメソッドの使い方
Enumにはメソッドも用意されています。メソッドの使い方についてもみていきましょう。
valueOfメソッド
valueOfメソッドは引数で指定した文字列から列挙子名を取得する場合に使用します。サンプルコードで確認しましょう。
public class Main { public static void main(String[] args) { if(Fruit.Orange == Fruit.valueOf("Orange")) { System.out.println("一緒です。"); } } protected enum Fruit { Orange, Apple, Melon }; }
実行結果:
一緒です。
下の記事ではこのvalueOfメソッドの使い方や用途をわかりやすく解説しています!
valuesメソッド
valuesメソッド全ての列挙子を返します。
public class Main { public static void main(String[] args) { for(Fruit frt : Fruit.values()) { System.out.println(frt); } } protected enum Fruit { Orange, Apple, Melon }; }
実行結果:
Orange Apple Melon
valuesメソッドの使い方をわかりやすく解説したものがこちら記事です!
Enumクラスの使い方
JavaのEnumはクラスです。クラスですので、フィールドやメソッドを定義することができます。フィールドやメソッドを定義する方法についてみていきましょう。
フィールド変数とコンストラクタの定義
C言語の列挙型は初期値(整数値)を与えることができました。
Javaの列挙型はクラスなので、C言語のように初期値を与えることはできません。Javaの列挙型はクラスでフィールドやコンストラクタも定義することができるので、コンストラクタを使って初期値を設定することができます。
初期値には数値はもちろん文字列も設定することが可能です。
数値の値を定義する場合
初期値に数値を設定する場合についてみていきましょう。
public enum Fruit { Orange(1), Apple(2), Melon(3); // フィールドの定義 private int id; // コンストラクタの定義 private Fruit(int id) { this.id = id; } }
このサンプルコードのように、int型のフィールドidを定義し列挙子の後に「( )」で囲って値を定義することができます。
なお、コンストラクタのアクセス修飾子はprivateのみ使用可能です。コンストラクタの処理を記述しない場合はエラーが発生しますので注意が必要です。コンストラクタの記述は値を保持するために必要なものだと考えて下さい。
文字列の値を定義する場合
初期値に文字列を定義することも可能です。
public enum Fruit { Orange("Ehime"), Apple("Aomori"), Melon("Ibaraki"); // フィールドの定義 private String name; // コンストラクタの定義 private Fruit(String name) { this.name = name; } }
メソッドの定義について
次に、メソッドの定義についてみていきましょう。定義したフィールドの値を取得する例をみてみましょう。
public class Main { public static void main(String[] args) { for(Fruit frt : Fruit.values()) { System.out.println(frt.ordinal() + ":" + frt.name() + "," + frt.getValue()); } } protected enum Fruit { Orange("Ehime"), Apple("Aomori"), Melon("Ibaraki"); // フィールドを定義 private String name; // コンストラクタを定義 private Fruit(String name) { this.name = name; } // メソッド public String getValue() { return this.name; } } }
実行結果:
0:Orange,Ehime 1:Apple,Aomori 2:Melon,Ibaraki
このサンプルコードでは、列挙子の値を取得するためにメソッドgetValueを定義しています。
また、Enumクラスにあらかじめ用意されているordinalメソッドとnameメソッドを使っています。ordinalメソッドは列挙子の順番を取得し、nameメソッドは列挙子名を取得します。
なお、Java6以前の環境ではswitch文でString型を指定できなかったので、enumを使って記述を工夫する必要があると前述しています。この場合にも、メソッドを定義する必要があります。
詳しい内容については、こちらを参考にしてくださいね。
Enumクラスの注意点
Enumクラスを使用する際の注意点をおさらいしておきます。
- Enumクラスの列挙子には値を付与することができますが、その場合はフィールドとコンストラクタを定義する必要があります。
- Enumクラスのコンストラクタのアクセス修飾子はprivateのみ許されます。
- Enumクラスは別のクラスを継承することはできませんが、インターフェースを実装することはできます。
まとめ
いかがでしたか?
Enumは列挙型と呼ばれるクラスであることがわかりました。Javaの列挙型では単なる列挙子のあつまりというわけではなく、独自の機能が追加できる特別なクラスであることも学びました。
そしてvalueOfやvaluesメソッドを使うことにより、自分の開発状況にあった便利な処理が書けることも学びました。もしEnumについて使い方を忘れた場合は、ぜひこの記事を思い出して下さい!