Hatena::ブログ(Diary)

放浪するエンジニアの覚え書き このページをアンテナに追加 RSSフィード

2009-01-16

TypeSafeなEnumを拡張する

| 10:38 |  TypeSafeなEnumを拡張する - 放浪するエンジニアの覚え書き のブックマークコメント

TypeSafeなEnumの「」には、プロパティーを追加したり、メソッドを追加したりという拡張を施すことができる

ここでは、このようなTypeSafeなEnumの拡張を行ってみる。

一風変わった書き方になる。

サンプルを見た方が速いので、サンプルコードを以下に示す。

package test;

/**
 * Enum(列挙型)のサンプル2
 * 
 */
public class ExampleEnum2 {
    // (A) enumの拡張定義と同時に、列挙型オブジェクトを生成。
    //     HOP("ホップ")… 新しいコンストラクタとなっていることに注意。
    public enum Status {HOP("ホップ"),STEP("ステップ"),JUMP("ジャンプ");
        
        // (B) Statusクラスにプロパティーを追加
        private final String str;

        // (C) コンストラクタのオーバーロード
        Status(String _str){ 
            this.str=_str;
        }
    
        // (D) メソッドの追加
        public String say(){
            return str;
        }

    } // (E) 拡張の終了

    public static void main(String[] args){

        // (F)拡張したメソッドを使う
        for(Status sts : Status.values())
            System.out.println(sts.say()); 
    }    
}

ここで注意すべきは、

点にある。なんとなく、気持ちの悪い書き方だ。

この新しいコンストラクタ定義により、(A)にある

   HOP("ホップ"),STEP("ステップ"),JUMP("ジャンプ")

という、「値に引数を与える」ことができるようになる。

最後になったが、Java5.0で導入されたEnumは、わざわざ「Typesafe(型について安全)なEnum」と呼ばれる。

これは、enum型として定義した列挙型変数(上の例ではStatus)に、他の型(プリミティブ型、参照型)を代入するとコンパイルエラーになることを意味してる。

つまり、Genericsと同じメリット、「実行時エラーをコンパイルエラーにする」ことで、バグを早期に潰すことを意味している。