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の格言」で解説されていました。