ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

enum(列挙型)

enumとは型付き定数を作る為の機能です。JDK1.5から取り入れられた機能らしく、
ここでは、下記のように記述します。

public enum enumSample {
    January,February,March,April,May,June,July,August,September,October,November,December
}

通常"class"になるところが、"enum"となっています。これで中に、定数としたいものを列挙していきます。サンプルソースでは、月を置いています。
下記ソースでは、その取り出し方や使い方を書いています。

public class enumMain {
    public static void main(String[] args) {
        enumSample es = enumSample.April;
      //  enumSample es1 = 4;   これはコンパイルエラー。enum型はint型ではない。
        enumSample es = enumSample.April; 
        System.out.println(es);
        enumSample es2 = enumSample.valueOf("April");  //文字列をenum型に変換。存在しなければ実行時例外となる。
        for (enumSample ese : enumSample.values()){  //enumSanmpleの中身を全部出力する
            System.out.println(ese);
        }
    }
}

enum型は、型なので他の型を代入しようとするとコンパイルエラーとなります。サンプルソースに"es1"の変数にint型の"4"を入れようとしていますが、コンパイルエラーとなります。文字列型からenum型に変換するのは、valueOfメソッドを使用します。また、enum型の中にある列挙すべてを取り出すには、拡張for文を使用して簡単に取り出せます。
JDK1.5以前は、このような機能がなかった為、static final int を使用してenum型っぽいものを実現していました。しかし、これはenum型が使える今となってしまっては色々諸問題があります。下記に4点あげます。

  • タイプセーフではない・・・定数として想定した以外の値も使えてしまう。enum型だと違う型の値を使うとコンパイルエラーとなります。
  • 面倒・・・"static final int"の場合、異なる数値を明示的に割り振ってあげなければならない。enum型ならユニークな名前を並べるだけで実現できます。
  • 文字列と相互交換ができない・・・enum型なら自動的にtoStringメソッドやvaluesメソッドが提供される。"static final int"は別実装が必要となります。
  • すべての定数値を管理できない・・・enum型ならvaluesメソッドですぐに呼び出すことが可能です。

この4点からしてもJNDK1.5以降は、定数を使用する場合は、enum型を積極的に使用するべきだと思います。