あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

J2SE5.0のenum型

J2SE5.0より前のjavaでは、定数は

   public static final int HOGE = 1;
   public static final int HOGEHOGE = 2;

などとしていました。この場合の問題は、定数がただのint型ということです。この定数を使用するメソッドは、HOGEでも、ただの1でも型(int)としては、同じなので、そのままではチェックが行われないことです。

これをタイプセーフでないといいます。
これがJ2SE5では、タイプセーフなenumが使用できるようになります。

    enum Hoge{ HOGE, HOGEHOGE };

    Hoge val = Hoge.HOGE;

    if( val == Hoge.HOGE ){
         // if文内が処理される
    }
    if( Hoge.HOGE.equals(val1) ){
         // if文内が処理される
    }

HOGEとHOGEHOGEは、いきなり定数として宣言できます。
enumは、classと同じ用にコンストラクタやメソッド、変数を定義することもできます。

    enum Hoge{ HOGE, HOGEHOGE };

    Hoge val = Hoge.HOGE;

    // 型が違う(Hoge型とint型)のでコンパイルエラーになります。
    if( val == 1 ){
        //
    }


C/C++の列挙型でも同じタイプセーフでない問題を持っています。
C/C++の列挙型は、int型と同じ整数として処理されます。


以前のjavaでタイプセーフなenumを実現する方法は、「Effective Java プログラミング言語ガイド」「Javaの格言」で解説されていました。