The HIRO Says

If you smell what The HIRO is cooking!!!

【enum】変数とメソッドの追加

enum には、変数とメソッドを定義することもできます。
…といっても、基本的な定義方法は、通常のクラス定義と同じです。
ただ、それだけだと面白みがないので、今回は enum ならではの定義方法を説明しようと思います。


enumならではの変数の定義方法

  1. 定数の後に、インスタンス変数を定義します。
  2. インスタンス変数をセットできる、private なコンストラクタを用意します。
  3. 定数定義を、インスタンス変数をセットするように変更します。


初めはこういう定義だったとすると…

public enum Season {
    // 春
    SPRING,
    // 夏
    SUMMER,
    // 秋
    AUTUMN,
    // 冬
    WINTER;

     ↓
このように変更できます。

public enum Season {
    // (3)インスタンス変数をセットするよう変更
    // 春
    SPRING("あけぼの"),
    // 夏
    SUMMER("夜"),
    // 秋
    AUTUMN("夕暮れ"),
    // 冬
    WINTER("つとめて");

    // (1)インスタンス変数を追加
    private final String word;

    // (2)インスタンス変数を受け取るコンストラクタを追加
    private Season(String word) {
        this.word = word;
    }

メソッドの定義方法

例えば上記の Season クラスで、新たに追加したインスタンス変数 word の getter を作りたい場合は、普通のクラスと同様、以下の定義を追加すればOKです。

    public String getWord() {
        return this.word;
    }

変数とメソッドの追加のメリット

例えば、こんなことができるようになります。

    public void testPrintf() {
        for (Season season : Season.values()) {
            System.out.printf(
                "%s is %s.%n",
                season.toString(),
                season.getWord());
        }
    }

↓実行結果はこちら。

SPRING is あけぼの.
SUMMER is 夜.
AUTUMN is 夕暮れ.
WINTER is つとめて.


例はアレですが、これまでの int や String の enum ではできなかったような、定数句独自のデータや処理を簡単に追加できるようになることが分かると思います。