2005.11.21 株式会社四次元データ CTO 畠中晃弘
Java言語機能(JDK5.0(Tiger)新機能) 4章 enum
- 4.1. 簡単な enum
- 4.2. カスタムのメソッドの実装
- 4.3. 定数ごとに異なる振る舞いを持った enum
- 4.4. switch - case 文での利用
- 4.5. EnumMap
- 4.6. EnumSet
4.3. 定数ごとに異なる振る舞いを持った enum
さらに、enum の定数は定数ごとに異なる実装のメソッドを保持することができます。定数ごとに異なるメソッドの実装は、定数宣言の箇所に中カッコ「{...}」ブロックで記述します。
public enum Style { BOLD() { public String apply(String s) { return "<b>" + s + "</b>"; }}, ITALIC() { public String apply(String s) { return "<i>" + s + "</i>"; }}, RED() { public String apply(String s) { return "<span style=\"color:#FF0000\">" + s + "</span>"; }}; abstract public String apply(String s); }
この例では、定数ごとに実装の異なる apply というメソッドを定義しています。
System.out.println(Style.ITALIC.apply("hello!")); // 「<i>hello!</i>」と表示される。
定数ごとにメソッドの実装を行った場合、これらの定数は同じクラスのインスタンスではありえません。内部的には匿名のサブクラスが定数ごとに作成されます。このようなとき、各定数のインスタンスから、もとの宣言されたクラスを調べるために java.lang.Enum クラスには getDeclaringClass() というメソッドが用意されています。
定数別メソッドを実装していない Color クラスでは以下の関係が成り立ちます。
Color.class == Color.RED.getClass() → true Color.RED.getClass() == Color.BLUE.getClass() → true
しかし、定数別メソッドを実装した Style クラスでは同じ関係は成り立ちません。
Style.class == Style.BOLD.getClass() → false Style.BOLD.getClass() == Style.ITALIC.getClass() → false
getDeclaringClass メソッドを利用すると、宣言されたクラスを取得することができます。
Style.class == Style.BOLD.getDeclaringClass() → true Style.BOLD.getDeclaringClass() == Style.ITALIC.getDeclaringClass() → true
4.4. switch - case 文での利用
J2SE1.4 までは switch 文で使用できる型は整数プリミティブ型(int/short/char/byte)のみでしたが、J2SE5.0 では enum 型参照も使用できるように言語仕様が拡張されました。
Color color; ... switch (color) { case RED: ... case BLUE: ... case YELLOW: ... case BLACK: ... case WHITE: ... }
この際、case 文のラベルには定数名だけを記述します。通常は外部から enum 型の定数を参照するときにはクラス名が必要ですが(たとえば、Color.RED というように)、case 文のラベルとして使用するときは特別に定数名だけで良い事になっています。次章で説明する static インポートが宣言されている必要もありません。