【Java学習|初心者向け】Javaの進化を使いこなそう!switch式における「ターゲット型推論」を徹底解説

導入:なぜ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の進化を実感できるはずです。

コメント

タイトルとURLをコピーしました