if-else switchイデオム

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

ところが、残念なことに、sがnullの場合はdefaultには飛ばず、ぬるぽが発生します。 そこで、null判定は事前にif文で行うことになるので、次のようなif-else switchイデオムを使うと便利です。 Integer型など、ラップクラスやenumでのswitchでも同じことが起こるので、同様に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");
    }

ほむほむ、if の後の文が1つなら中括弧が省略できる*1というやつですね。

そういえば JavaScript では

for (var key in obj) if (obj.hasOwnProperty(key)) {
   // ...
}

こんな書き方が可能だと社内でちょっと話題になったけど、全く流行らなかったw

最近は

Object.keys(obj).forEach(function(key) {
   // ..
});

が良いのだろうけど、関数コールのコストが意外と高いのでイテレーションの回数が多そうだと躊躇する。

*1:正確には逆で、文法上 if や else の後ろには中括弧は必要とされていない。ただ、if の後には文が1つしか書けないため、複数の文を書きたい場合は、1つの文のように扱わせるために中括弧でくくってコードブロックにしなければならない