TypeSafeなEnum(基本)
Java5.0より、Typesafe(タイプセーフ;型に関して安全)なEnumという型が追加された。
リテラル(値)を列挙して保持するのに用いられることから、「列挙型」と呼ばれる。
一種の内部クラスであって、少し変わった動きをする。
まずは、簡単なサンプルを書いて、Enumの挙動を確認する。
package test; /** * Enum(列挙型)のサンプル1 * */ public class ExampleEnum1 { // (A) enumの定義 public enum Status {HOP,STEP,JUMP} public static void main(String[] args) { // (B) enum定義したクラスStatusへのアクセス System.out.println(Status.HOP); System.out.println(Status.STEP); System.out.println(Status.JUMP); // (C) 比較(条件分岐)のテスト; Stringとの直接比較 if(Status.HOP.equals("HOP")){ System.out.println("check if : true"); }else{ System.out.println("check if : false"); } // (D) 比較(条件分岐)のテスト; Stringへ変換しての比較 if(Status.HOP.toString().equals("HOP")){ System.out.println("check if : true"); }else{ System.out.println("check if : false"); } // (E) 比較(条件分岐)のテスト; for(Status sts : Status.values()) // (E) switch(sts){ // (F) case要素として、Enumをつかうと、Status.を省略できる。 case HOP : System.out.println("STATUS: "+ sts.toString()); break; case STEP : System.out.println("STATUS: "+ sts); break; case JUMP : System.out.println("STATUS: "+sts); break; } } }
これを実行すると、以下の結果が得られる。
HOP STEP JUMP check if : false check if : true STATUS: HOP STATUS: STEP STATUS: JUMP
(A)がEnumの定義。一種の内部クラスなので、mainメソッドの外に定義する。
定義の形式は、(A)の通り
アクセス修飾子 enum 列挙型名 {文字列1, 文字列2, 文字列3, ・・・}
となる。
これは、Enumを継承して、列挙型名の内部クラスを作り、それに、文字列1、2、3、…という値を列挙して定義するという意味を持つ(Java5.0のEnumのAPIドキュメントはこちら)。
この例では、Enumを継承してStatusクラスを作り、HOP、STEP、JUMPというリテラル(値)を定義するということになる。
(また、Enumを継承してStatusが作成される際には、Enumクラスには定義されていないStatus[] values()メソッドと、Status valueOf(String _str)メソッドが追加される)
(B)は、列挙したHOP、STEP、JUMPへのアクセス方法を例示している。
列挙型名.値
がアクセス方法となる。
(C)と(D)は、ともに、列挙型の値とString型の"HOP"との比較をする実験である。
(C)はfalse、(D)がTrueとなること、すなわち、列挙された値であるHOP, STEP, JUMPが単純なストリングでないことがわかる。
(E)はswitch文に適用する例である。
上の例では、Status.values()で値の配列を取り出し、拡張for文によって順に取り出して処理を行っている。
この場合には、(F)のように、「値」だけを記述したcase文での比較ができるという仕様となっている。