こんにちは、さるまりんです。
今日は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
で宣言しています。値を使いたいこともあるのでvalue
のgetter
もつけています。
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("○")
と書き換えることができます。
これがベストではないとは思いますが、実装例の一つとして書いてみました。
もっと便利な使い方あるんだろうな。勉強していきたいと思います。
読んでくださってありがとうございます。
それではまた!