Java SE 7から、switch構文で文字列が使えるようになりました。
public void hoge(String s){ switch(s){ case "a": System.out.println("AA"); break; case "b": System.out.println("BB"); break; default: System.out.println("Other"); } }
ところが、残念なことに、sがnullの場合はdefaultには飛ばず、ぬるぽが発生します。
そこで、null判定は事前にif文で行うことになるので、次のようなif-else switchイデオムを使うと便利です。
if(s == null){ System.out.println("Null!"); }else switch(s){ case "a": System.out.println("AA"); break; case "b": System.out.println("BB"); break; default: System.out.println("Other"); }
Integer型など、ラップクラスやenumでのswitchでも同じことが起こるので、同様にif-else switchイデオムが使えます。
安全なコードを書くときには、文字列やInteger、enumなどオブジェクトでのswitchはif-else switchになっていないといけないと考えたほうがいいと思います。
Integerでのswitchでぬるぽが出るのは、オートアンボクシング時の挙動なので仕方ないですが、文字列やenumでのswitchのぬるぽ対応はどうにかならなかったかなーと思います。内部でhashCode使うことを考えると難しいのはわかるけど。
EFFECTIVE JAVA 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: 丸善出版
- 発売日: 2014/03/11
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (12件) を見る