Enumクラスはとても便利です。
定数として扱うだけでなく自分でメソッドを追加出来たり、既に用意されている便利なメソッドを使ったりすることもできます。
しかし、Enumクラスで文字列を扱う際に
「文字列とEnumの定数を比較したいけどどうすればいいの?」
「switchのcase文で文字列は使えないけどEnumを使うことで実現可能なの?」
などと言ったお声を耳にします。
そういった方にはこの記事を見れば文字列⇔列挙型の変換方法やswitch文で文字列を使った分岐方法がわかるようになります!
なお、Javaの記事については、こちらにまとめています。
enumについて
まず本記事の本題に入る前にenumがどんなものかを軽くおさらいしておきましょう!
次のコードを見て下さい。
protected enum Fruit { Orange, Apple, Melon }; public static void main(String[] args) { Fruit fruit_type = Fruit.Orange; }
このコード自体は特に何かをするものではありませんがmainメソッドよりも前にenumというキーワードが付いたブロック(処理の塊)があります。
このブロックの中で定義されているOrangeやAppleは列挙子と呼ばれています。
enum自体の使い方の解説を深掘りすると本記事の目的に外れてしまうため避けておきますが、
なぜenumを使うのかというと簡単に言ってしまえば読みやすさ(可読性)を向上させることができるからです。
列挙子と文字列を比較したい
Enumを使っていると列挙子と文字列を比較したい場合が出てくるかと思います。
まずは次のコードをみてください。
public enum Fruit { Orange("Ehime"), Apple("Aomori"), Melon("Ibaraki"); private final String name; Fruit(String name) { this.name = name; } } public static void main(String[] args) { Fruit frt = Fruit.Orange; if(frt == "Orange") { System.out.println("Equal!"); } }
これはエラーが発生します。
error: incomparable types: Fruitand String
では上記のコードのifの条件をtrueにするにはどうすればよいでしょうか。
二つ方法がありますので見てみましょう。
(if文の部分だけ掲載します。)
if(frt.toString() == "Orange")
または
if(frt == Fruit.valueOf("Orange"))
とすることでエラー無く比較ができるようになります!
valueOfについてはこちらをご覧ください!
switch文で文字列の分岐が可能!?
通常Javaでは文字列をswitch文で分岐させようとするとエラーがでて実行することができません。
しかし、Enumを使うことで擬似的に文字列分岐を行うことができます。
ではどうやってやるか見てみましょう。
public enum Fruit { Orange("Ehime"), Apple("Aomori"), Melon("Ibaraki"); private final String name; Fruit(String name) { this.name = name; } String getName() { return this.name; } public static Fruit getEnumName(String str) { for(Fruit v : values()) { if(v.getName().equals(str)) { return v; } } throw new IllegalArgumentException("undefined : " + str); } } public static void main(String[] args) { switch(Fruit.getEnumName("Ibaraki")) { case Orange: System.out.println("おいしいみかん"); break; case Apple: System.out.println("りんごたべたい"); break; case Melon: System.out.println("メロンがすべて"); break; } }
独自メソッドを定義して内部で拡張for文を使ってvaluesメソッドの要素を一つずつ取得していき列挙子の値に一致するものがあればその列挙子を返すという処理になっています。
Enumについてもっと詳しく!
Enumについてもっと詳しく知りたい方は必見です!
switch文の使い方総まとめ
switch文の使い方についてさらに詳しく知りたいときはこちらの記事を確認してください!
まとめ
いかがでしょうか。
列挙子名と文字列を比較したい場合はvalueOfを使いましょう。
列挙子に設定した値を列挙子名に変換して使いたい場合は独自のメソッドを定義することで実現することができます。
もし忘れてしまったらこの記事を思い出して下さい!