タイプセーフEnumパターン

http://bleis-tift.hatenablog.com/entry/20080808/1218133517
予め用意してある定数値以外の値を代入できない型として振る舞うクラス。
Privateなコンストラクタを持つクラスが、staticな値として自身のインスタンスを持つコードで実現する。

public class Enum1
{
    private Enum1() {} // 外部でのインスタンス化不可
    
    public static readonly Enum1 Value1 = new Enum1();  // 定数1
    public static readonly Enum1 Value2 = new Enum1();  // 定数2
}

言語構文として用意されているenumと比較して、定数値にプロパティや振る舞いなどのメソッドを持つことができるとうい利点を持つ。
デメリットは、数値からタイプセーフ型への変換は専用のメソッドを用意してやらなければ行えないこと。(enumならキャストだけで出来る)
またenumは定義されていない-1などの値を無理矢理入れることができるが、タイプセーフEnumパターンではそれができない。
またタイプセーフEnumにはnullが代入できてしまう。
これはEnum構文が存在しなかった頃のJavaEnumのようなことを行うために生まれたパターンである。Effective Java で提唱。