Javaのenum(列挙型)で定数

こんにちは、さるまりんです。

今日はJavaのenum(列挙型)についてです。

Javaで定数を作成するとき、以前はstatic finalの変数をクラスに閉じ込めたり、interfaceに書いたりしていましたが、enumって便利ですね。

こんな感じで作ってみました。

public enum YesNo {
    YES,
    NO;
}

YesかNoか、「はい」か「いいえ」かを表すenumです。(booleanでいいよねってのは置いといて。)

↓のコードを実行すると

YesNo yes = YesNo.YES;
YesNo no = YesNo.NO;
System.out.println(yes);
System.out.println(no);

こんな出力になります。

YES
NO

定義したそのままが文字列で出力されました。

その文字列からenumを取得するためにvalueOf()メソッドが用意されています。

↓これを実行すると

System.out.println(YesNo.valueOf("YES"));

こうなります。

YES

便利ですね。

数字の1をYes、0をNoの意味としたいので、こんな風に変えてみました。

public enum YesNo {
    YES(1),
    NO(0);

    private int value;
    private YesNo(int v) {this.value = v;}

    public int getValue() {return this.value;}

    public static YesNo valueOf(int v) {
        for(YesNo e : YesNo.values()) {
            if (e.getValue() == v) return e;
        }
        return null;
    }
}

数値を持つためにintの変数valueを持つようにしました。コンストラクターは外から呼び出せないようにprivateで宣言しています。値を使いたいこともあるのでvaluegetterもつけています。

staticメソッドのvalueOf(int v)は数値からenumを取得したい、YesNo.valueOf("NO")みたいにYesNo.valueOf(0)がしたくて実装しました。

このコードを実行すると

System.out.println(YesNo.valueOf(0));
System.out.println(YesNo.valueOf(1));
System.out.println(YesNo.valueOf(2));

こうなります。

NO
YES
null

数値2に対応するenumはないのでnullです。

さらに変更です。

文字列”○”をYes、”×”をNoとして扱いたい。そのために↓のように変えてみました。

public enum YesNo {
    YES(1, "○"),
    NO(0, "×");
    private int value;
    private String label;
    private YesNo(int v, String l) {
        this.value = v;
        this.label = l;
    }
    public int getValue() {return this.value;}
    public String getLabel() {return this.label;}

    public boolean labelMatches(String l) { return this.label.equals(l); }

    public static YesNo valueOf(int v) {
        for(YesNo e : YesNo.values()) {
            if (e.getValue() == v) return e;
        }
        return null;
    }

    public static YesNo getByLabel(String l) {
        for(YesNo e :YesNo.values()) {
            if (e.getLabel().equals(l)) return e;
        }
        return null;
    }
}

valueOf(String)メソッドはすでにあるので、○か×かでenumを取るためのstaticメソッドgetByLabel(String)を追加しています。

これを実行すると

System.out.println(YesNo.getByLabel("○"));
System.out.println(YesNo.getByLabel("△"));

こうなります。

YES
null

△をlabelとして持つenumはないのでnullになっています。

もらった文字列がlabelと一致しているかをメソッドlabelMatches(String)でチェックしています。

これを実行すると

System.out.println(YesNo.YES.labelMatches("○"));

true

です。

YesNo.YES.labelMatches("○")がちょっと長いので、よく使うのであればとこんなメソッドを用意しました。

public static boolean isYes(String l) {
    return YES.labelMatches(l);
}

public static boolean isNo(String l) {
    return NO.labelMatches(l);
}

isYes()が「Yesですか?」、isNo()が「Noですか?」です。

上の長いコードはYesNo.isYes("○")と書き換えることができます。

これがベストではないとは思いますが、実装例の一つとして書いてみました。

もっと便利な使い方あるんだろうな。勉強していきたいと思います。

読んでくださってありがとうございます。

それではまた!