【Java進化史 第3回】Java7 - switch文は何を守り、何を変えなかったのか?
Java7には、もう一つ地味な変更がある。
switch文で String が使えるようになった ことだ。
■ Java6までのswitch
switchで使えるのは、 int や enum などの限定的な型だけだった。
switch (statusCode) {
case 0:
...
break;
case 1:
...
break;
}
文字列で分岐したい場合、 if-else を使うことが多かった。
if ("OK".equals(status)) {
...
} else if ("ERROR".equals(status)) {
...
}
あるいは、enumを用意して対応する。
少し回り道が必要だった。
■ Java7での変更
Java7からは、 Stringがswitchで使えるようになった。
switch (status) {
case "OK":
...
break;
case "ERROR":
...
break;
}
可読性は確かに上がる。
素直に書けるようになった。
これは小さいが、現場では確実に効く変更だ。
■ だが、変わらなかったものがある
それが fall-through だ。
breakを書かなければ、 次のcaseへ処理が流れる。
switch (level) {
case 3:
log("HIGH");
case 2:
log("MEDIUM");
case 1:
log("LOW");
break;
}
これはC言語由来の仕様。
Javaはここを変えなかった。
■ 他言語との違い
近年の言語では、 fall-throughは基本的に採用されていない。
- Kotlin → 自動で終了(break不要)
- Swift → 自動で終了
- Rust → fall-throughなし
一方で、CやC++では明示的なbreakが必要だ。
breakを書き忘れてバグになる。
経験のある人も多いのではないだろうか。
■ なぜJavaは残したのか?
理由は明確だ。
後方互換性。
既存コードを壊さない。
Javaはこの原則を徹底している。
そしてもう一つ。
Javaは「削除」ではなく 「追加」で進化する言語だからだ。
古い構文は残す。
その上で、新しい選択肢を足していく。
■ C言語世代の安心感
50代後半以上のエンジニアの多くは、 C言語からキャリアを始めたのではないだろうか。
私もその一人だ。
fall-throughを見ると、 どこか安心する。
「ああ、これはCと同じだ」と。
JavaがCに似ている部分を残しているのは、 偶然ではない気がする。
だが同時に、 言語設計は少しずつ安全性と明確さへ向かっている。
守るものと、変えるもの。
そのバランスの上に、 Javaの進化はある。
■ まとめ
Java7のswitch変更は、 革命ではない。
だが、
Javaは「何を変えないか」を選び続けている。
それがJavaらしさだ。
守りながら、少しずつ進む。
それがこの言語の進化の形なのだと思う。
0 件のコメント:
コメントを投稿