JDK1.5 より前の Java では、「Typesafe Enum」パターンが、有限の数の値しか取れない型を実装する一般的な方法でした。
public class Suit {
private final String name;
public static final Suit CLUBS =new Suit("clubs");
public static final Suit DIAMONDS =new Suit("diamonds");
public static final Suit HEARTS =new Suit("hearts");
public static final Suit SPADES =new Suit("spades");
private Suit(String name){
this.name =name;
}
public String toString(){
return name;
}
}
(例えば、ブロックの項目21を参照)効果的なJava)。
現在、JDK1.5 以降では、次のようにするのが「公式」の方法ですenum
。
public enum Suit {
CLUBS("clubs"), DIAMONDS("diamonds"), HEARTS("hearts"), SPADES("spades");
private final String name;
private Suit(String name) {
this.name = name;
}
}
明らかに、構文は少し良くて簡潔になっています (値のフィールドを明示的に定義する必要がなく、適切なものがtoString()
提供されます) が、これまでのところ、enum
Typesafe Enum パターンに非常によく似ています。
私が認識している他の違いは次のとおりです。
- 列挙型は自動的に
values()
メソッドを提供する - enum は以下で使用できます
switch()
(コンパイラは値を忘れていないかどうかもチェックします)
しかし、これはすべて、いくつかの制限(enum
常に から継承しjava.lang.Enum
、サブクラス化できないなど)が加えられた単なる構文糖に過ぎないように見えます。
enum
Typesafe Enum パターンでは実現できない、より基本的な他の利点はありますか?
ベストアンサー1
- 「サブクラス化できない」というのは制限ではありません。これは大きな利点の 1 つです。これにより、 で定義された値のセットだけが常に存在し、
enum
それ以上は存在しないことが保証されます。 enum
シリアル化を正しく処理します。できる型安全な列挙型でも同様に行うが、忘れられがちである(または単に知られていない)。これにより、e1.equals(e2)
いつもe1 == e2
任意の 2 つのenum
値に対してe1
、およびを意味しますe2
(逆もまた同様ですが、後者の方がおそらく重要です)。- 列挙型を扱うための特定の軽量データ構造があります:
EnumSet
およびEnumMap
(この答え)