いろいろガンガンいこうぜ。体も大事に

普段はJavaでAndroidアプリ開発しているプログラマーのブログです。

Javaの列挙型について(2)

前回に引き続き列挙型。



今回は月を表す列挙型と,その使用例。




Month.java

package com.rmstar.enumsample;

public enum Month {
    JANUARY,
    FEBRUARY,
    MARCH,
    APRIL,
    MAY,
    JUNE,
    JULY,
    AUGUST,
    SEPTEMBER,
    OCTOBER,
    NOVEMBER,
    DECEMBER, ;
}


Main.java

package com.rmstar.enumsample;

public class Main {

    private static void showInOldJapanese(Month month) {
        switch (month) {
            case JANUARY:
                System.out.println("睦月");
                break;
            case FEBRUARY:
                System.out.println("如月");
                break;
            case MARCH:
                System.out.println("弥生");
                break;
            case APRIL:
                System.out.println("卯月");
                break;
            case MAY:
                System.out.println("皐月");
                break;
            case JUNE:
                System.out.println("水無月");
                break;
            case JULY:
                System.out.println("文月");
                break;
            case AUGUST:
                System.out.println("葉月");
                break;
            case SEPTEMBER:
                System.out.println("長月");
                break;
            case OCTOBER:
                System.out.println("神無月");
                break;
            case NOVEMBER:
                System.out.println("霜月");
                break;
            case DECEMBER:
                System.out.println("師走");
                break;
        }
    }

    private static void showSeason(Month month) {
        switch (month) {
            case MARCH:
            case APRIL:
            case MAY:
                System.out.println("春");
                break;
            case JUNE:
            case JULY:
            case AUGUST:
                System.out.println("夏");
                break;
            case SEPTEMBER:
            case OCTOBER:
            case NOVEMBER:
                System.out.println("秋");
                break;
            case DECEMBER:
            case JANUARY:
            case FEBRUARY:
                System.out.println("冬");
                break;
        }
    }

    public static void main(String[] args) {
        showInOldJapanese(Month.JULY);
        showSeason(Month.JULY);
    }
}



長い!
switch文...
これにもしかしたら,
1月と表示するメソッドとかDECとか表示するメソッドが加わるかもしれない。
良くない。





Javaの列挙型は,CやC#と違いクラス。



文月や夏といったものはJULYに紐づくものだから,
JULYインスタンスのフィールドに持たせて,ゲッタでアクセスするよう変更した。
変更後は以下の通り。




Month.java(変更後)

package com.rmstar.enumsample;

public enum Month {
    JANUARY("睦月", "冬"),
    FEBRUARY("如月", "冬"),
    MARCH("弥生", "春"),
    APRIL("卯月", "春"),
    MAY("皐月", "春"),
    JUNE("水無月", "夏"),
    JULY("文月", "夏"),
    AUGUST("葉月", "夏"),
    SEPTEMBER("長月", "秋"),
    OCTOBER("神無月", "秋"),
    NOVEMBER("霜月", "秋"),
    DECEMBER("師走", "冬"), ;

    private final String mOldJapaneseName;
    private final String mSeason;

    private Month(String oldJapaneseName, String season) {
        mOldJapaneseName = oldJapaneseName;
        mSeason = season;
    }

    public String getOldJapaneseName() {
        return mOldJapaneseName;
    }

    public String getSeason() {
        return mSeason;
    }
}


Main.java(変更後)

package com.rmstar.enumsample;

public class Main {
    public static void main(String[] args) {
        System.out.println(Month.JULY.getOldJapaneseName());
        System.out.println(Month.JULY.getSeason());
    }
}

すっきり。
もう一つ。


MonthのInstance全ての旧暦を表示したい。

        System.out.println(Month.JANUARY.getOldJapaneseName());
        System.out.println(Month.FEBRUARY.getOldJapaneseName());
        ・・・
        System.out.println(Month.DECEMBER.getOldJapaneseName());

という風に,書く?
めんどくさい。




こういうことを楽にする仕組みが列挙型にはあるらしい。
次回は,そのような列挙型でできることを確認したいと思います。






では,また会えることを祈りつつ。