Javaの列挙タイプ-2:高度なプロパティ


Javaでは、列挙タイプは本質的にクラスであり、列挙の定数はその列挙タイプのインスタンスである.列挙タイプにはいくつかの制限があります.たとえば、サブ列挙タイプを派生させることはできません.コンストラクション関数を呼び出すことはできませんが、列挙タイプでコンストラクション関数、フィールド、メソッドを定義できます.たとえば、次のようにします.
enum Weekday {
    SUNDAY("SUN"), 
    MONDAY("MON"), 
    TUESDAY("TUE"), 
    WEDNESDAY("WED"), 
    THURSDAY("THU"), 
    FRIDAY("FRI"), 
    SATURDAY("SAT");

    private String abbr;

    public Weekday(String abbr) {
        this.abbr = abbr;
    }

    public getAbbreviation() {
        return abbr;
    }

}

 上のコードでは、Weekdayにnew文で呼び出すことはできませんが、定数を宣言するときに呼び出すことができます.定数の後ろに括弧を付けてパラメータを渡すだけでいいです.このように異なる定数オブジェクトには異なる属性値があり、この値はフィールドabbrに格納されます.また,この列挙タイプはメソッドを定義し,ある定数への参照を得た後,getAbbreviation()メソッドを呼び出すことができる.例:
System.out.println(Weekday.SUNDAY.getAbbreviation());

 列挙タイプには、定数を宣言するときに列挙のメソッドを書き換えることで、次のような「マルチステート」の効果を達成する特殊な機能があります.
public enum SomeEnum {
    CONST_A, CONST_B, CONST_C {
        public void someMethod() {
            System.out.println("another description");
        }
    };

    public void someMethod() {
        System.out.println("default description");
    }
}

 
CONST経由でAとCONST_B someMethod()メソッドを呼び出すと、画面にdefault descriptionが印刷され、CONT_C someMethod()メソッドを呼び出すとanother descriptionが印刷されます.
 
参考書:『Javaプログラミング思想』『SCJP試験ガイド』