文字列でswitchするときはif-else switchイデオムを使うほうが安全

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)

EFFECTIVE JAVA 第2版 (The Java Series)