導入:なぜswitch式の「ターゲット型推論」が重要なのか
Java 12から導入された「switch式」は、従来のswitch文よりも簡潔で安全に値を返せる強力な機能です。しかし、複数のcase句で異なる型の値を返そうとすると、コンパイルエラーになることがあります。ここで重要になるのが「ターゲット型推論」です。この機能を理解することで、複雑な条件分岐をよりスマートに書き、コードの可読性と保守性を劇的に向上させることができます。
基礎知識:switch式とターゲット型推論とは
従来のswitch文は単なる「制御フロー(処理の分岐)」でしたが、switch式は「値を返す(式としての評価)」ことが可能です。
ここでいう「ターゲット型推論」とは、switch式全体が代入される先の変数(ターゲット)の型に合わせて、各case句で返される値の型をコンパイラが自動的に調整・決定する仕組みを指します。例えば、あるcase句でIntegerを返し、別のcase句でDoubleを返す場合、ターゲットがNumber型であれば、コンパイラはそれらをNumber型として統一しようと試みます。
実装:switch式とyieldの活用
switch式では、値を返すために yield キーワードを使用します。また、sealed class(封印クラス)と組み合わせることで、網羅的な条件分岐を安全に記述できます。
以下に、ターゲット型推論を活用した実用的なサンプルコードを示します。
サンプルプログラム:型推論を活用したswitch式
public class SwitchExample {
public static void main(String[] args) {
String input = "A";
// switch式の評価結果をNumber型として受け取る(ターゲット型推論)
// 各caseで異なる数値型を返しても、Numberとして統一される
Number result = switch (input) {
case "A" -> {
// 複雑な処理が必要な場合はブロック内でyieldを使用
yield 10; // Integer型
}
case "B" -> 20.5; // Double型
default -> 0.0f; // Float型
};
System.out.println("計算結果: " + result + " (型: " + result.getClass().getSimpleName() + ")");
}
}
応用・注意点:現場で陥りやすい罠
1. 網羅性の確保: switch式では、すべての可能な入力値をカバーしなければなりません。特にenumやsealed classを使う場合、default句が不要になる代わりに、すべてのサブクラスを網羅しないとコンパイルエラーになります。これは「予期せぬケース」を未然に防ぐための重要な仕組みです。
2. 型の不一致: ターゲット型推論は万能ではありません。例えば、IntegerとStringを混ぜて返そうとすると、共通の親クラスであるObject型に推論されてしまいます。Object型での受け取りは型の安全性を損なうため、極力避けるべきです。
3. if-elseとの使い分け: 単純な2択であればif-elseが適していますが、3択以上の分岐や、値を戻り値として扱う場合は、今回紹介したswitch式とyieldの組み合わせを優先しましょう。コードの意図が明確になり、バグの混入リスクを減らすことができます。
まずは小さなコードから、従来のswitch文をswitch式に書き換える練習をしてみてください。Javaの進化を実感できるはずです。

コメント