古い「Typesafe Enum」パターンに対する Java の enum の利点は何ですか? 質問する

古い「Typesafe Enum」パターンに対する Java の enum の利点は何ですか? 質問する

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()提供されます) が、これまでのところ、enumTypesafe Enum パターンに非常によく似ています。

私が認識している他の違いは次のとおりです。

  • 列挙型は自動的にvalues()メソッドを提供する
  • enum は以下で使用できますswitch()(コンパイラは値を忘れていないかどうかもチェックします)

しかし、これはすべて、いくつかの制限(enum常に から継承しjava.lang.Enum、サブクラス化できないなど)が加えられた単なる構文糖に過ぎないように見えます。

enumTypesafe Enum パターンでは実現できない、より基本的な他の利点はありますか?

ベストアンサー1

  • 「サブクラス化できない」というのは制限ではありません。これは大きな利点の 1 つです。これにより、 で定義された値のセットだけが常に存在し、enumそれ以上は存在しないことが保証されます。
  • enumシリアル化を正しく処理します。できる型安全な列挙型でも同様に行うが、忘れられがちである(または単に知られていない)。これにより、e1.equals(e2) いつもe1 == e2任意の 2 つのenum値に対してe1、およびを意味しますe2(逆もまた同様ですが、後者の方がおそらく重要です)。
  • 列挙型を扱うための特定の軽量データ構造があります:EnumSetおよびEnumMap(この答え

おすすめ記事