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文での比較ができるという仕様となっている。