4. enum
2005.11.21 株式会社四次元データ CTO 畠中晃弘
- 4.1. 簡単な enum
- 4.2. カスタムのメソッドの実装
- 4.3. 定数ごとに異なる振る舞いを持った enum
- 4.4. switch - case 文での利用
- 4.5. EnumMap
- 4.6. EnumSet
enum 型は、あるカテゴリーに属した複数の定数をひとまとまりとして取り扱うための仕組みです。J2SE 5.0 の enum は、C や C++ の enum ように内部的に整数で定数を保持するものではなく、タイプセーフ enum と呼ばれるパターンを実現したものになっています。
4.1. 簡単な enum
まずはじめに簡単な enum 型の定義を示します。
public enum Color { RED, BLUE, YELLOW, BLACK, WHITE }
enum は内部的にはクラスであり、enum 型を定義する場所はクラスを定義する場所と同じです。enum 型もクラス同様パッケージに属します。基本的には 1 ファイルにひとつの enum 型を定義し、型名と同じファイル名(Color 型であれば Color.java)のファイルに記述しますが、内部クラスのように他のクラスの内部にも定義することができます(クラス内部で定義した場合、暗黙的に static な型となります)。アクセス権やアクセス方法もクラスの場合と同じです。
上記の Color クラスを javap コマンドで逆コンパイルすると、以下のように表示されます。
Compiled from "Color.java" public class Color extends java.lang.Enum{ public static final Color RED; public static final Color BLUE; public static final Color YELLOW; public static final Color BLACK; public static final Color WHITE; static {}; public static final Color[] values(); public static final Color valueOf(java.lang.String); }
これから以下のようなことがわかります。
- enum 宣言された型は java.lang.Enum を継承している
- 各メンバはそれ自身宣言した型(もしくはそのサブクラス)のインスタンスであり、public static final な定数である
values メソッドは宣言された定数全てを含む配列(順序は記述順)を返すメソッドで、valueOf メソッドは文字列から定数インスタンスを取得するメソッドです。
Color white = Color.valueOf("WHITE"); // white は Color.WHITE を保持する。
Enum クラスでは他に以下のようなメソッドが定義されています。
メソッド | 説明 |
---|---|
public final String name() | 宣言で定義された定数名を返します。オーバーライドすることはできません。 |
public String toString() | 定数名を返します。デフォルトでは name() と同じ値を返しますが、オーバーライドすることもできます。 |
public final int ordinal() | 定数の宣言された順番を返します。ただし通常は順番に依存したプログラムを記述するべきではありません。 |
メソッドのオーバーライドの方法はこの章の後で説明します。
4.2. カスタムのメソッドの実装
enum 型では、独自のメンバ変数やメソッド(コンストラクタを含む)を定義することができます。
ここでは、さきほど例示した Color クラスを改良して、toString() メソッドで色の日本語名を返すようにしてみます。
enum 内の各定数はインスタンスですので、実行時には暗黙的にコンストラクタが呼び出されます。このコンストラクタには引数を持たせることができ、定数ごとに異なる引数を渡すことができます。渡す引数は、定数宣言の定数名の後に「(...)」を記述することで指定します。デフォルト以外のコンストラクタを使用する場合は、そのコンストラクタの実装も行います。
public enum Color { RED("赤"), BLUE("青"), YELLOW("黄"), BLACK("黒"), WHITE("白"); // メンバ変数の定義 private String name; // コンストラクタの実装 private Color (String name) { this.name = name; } // メソッドのオーバーライド public String toString() { return name; } }
定数の箇所に書いた引数は、各定数がインスタンス化されるときに呼び出されるコンストラクタに渡されます。つまりこの例では各インスタンスの name 属性にはそれぞれ色の日本語名を保持することになります。
System.out.println(color.RED.toString()); // 「赤」と表示される。