enumを利用してStringによるswitch制御を行うサンプルコード。
解説
ご存知の通り、Javaにおけるswitch文の条件判定にはStringを使用することができません。しかし、enumを利用することによって、この問題を解決することができます。enumによる擬似String-switch制御のサンプルコードを掲載しているサイトがこちら。
A Switch on String Idiom for Java
解説も丁寧で、非常に参考になる記事だと思います。
さて、条件判定に使用する文字列をそのままenumメンバの名前として使用できる場合には上記のサイトで紹介されているコードで問題ないのですが、必ずしもそうではないケースも出てくると思います。そういう場合のサンプルです。まずは、enum型のコードから:
public enum Animal { DOG("犬"), CAT("猫"), MONKEY("猿"), NOT_ANIMAL(""); private final String name; private Animal(String name) { this.name = name; } @Override public String toString() { return name; } public static Animal toAnimal(String name) { Animal result = null; for (Animal animal : values()) { if (animal.toString().equals(name)) { result = animal; break; } } return result != null ? result : NOT_ANIMAL; } }
このenum型を使用したswitch文のサンプル:
switch (Animal.toAnimal(animalName)) { case DOG: // "犬"の場合の処理 break; case CAT: // "猫"の場合の処理 break; case MONKEY: // "猿"の場合の処理 break; default: // それ以外の場合の処理 break; }
という具合に、やりたいことが実現できると思います。サンプルでは分かりやすくするためにtoAnimalメソッドの中で毎回ルックアップしていますが、プロダクションに使う際にはstaticコンストラクタなどを使ってキャッシュした方が良いでしょうね。
なお、enum型の応用的な使用方法についてはBlochの"More Effective Java"で詳しく解説されています。
- 作者: Joshua Bloch
- 出版社/メーカー: Prentice Hall
- 発売日: 2008/05/08
- メディア: ペーパーバック
- 購入: 6人 クリック: 65回
- この商品を含むブログ (42件) を見る
関連リンク
- Project Coin:http://blogs.sun.com/darcy/entry/project_coin
- Javaに含めて欲しい言語仕様が集められたサイト。"Strings in switch"が筆頭に上がっています。
- 上記サイトの紹介を含むJavaPosse:Newscast for Feb 6th 2009
- 会話の中で「enumを使えばいいんだよ」という話が出てきます。
補注
今回のエントリは純粋に「Stringによるswitch制御はどうすれば書けるのか」という観点から書いています。しかし「ここまでしてswitchを実装しなければならないのか」という話は、これとは別に考えなければならないものだということを、最後に強調しておきたいと思います。