【Java学習|実務向け】Java 21以降のモダンな制御フロー:パターンマッチングによるwhen句の活用術

導入: なぜ今、パターンマッチングとwhen句なのか

Java 17以降のプレビューを経て、Java 21で正式導入された「switch式」と「パターンマッチング」は、従来のif-elseの連鎖を劇的に簡潔にします。特に、単なる型の判定だけでなく、値の範囲や特定の条件で絞り込みを行いたい場合、「when句(ガード条件)」が極めて重要です。複雑なビジネスロジックにおける条件分岐を整理し、バグの温床となりやすいネストを解消するために、この技術を習得することは現代のJava開発において必須と言えるでしょう。

基礎知識: パターンマッチングとwhen句の仕組み

Javaのswitch文は、かつてはプリミティブ型や列挙型、String型に限定されていました。しかし、最新のJavaでは「パターンマッチング」により、オブジェクトの型を直接判定できます。

when句(ガード条件)とは、パターンマッチングの際に「その型であること」に加えて、「特定の条件を満たすこと」を判定するための追加条件です。これにより、if文をswitchの外側に書く必要がなくなり、宣言的で読みやすいコードが実現できます。

実装/解決策: switch式の柔軟な活用

実装のポイントは、switch式のcaseラベル内で「when」キーワードを使用して評価条件を追加することです。これにより、例えば「特定の型」かつ「数値が100以上」といった条件を1つのcaseで記述できます。

サンプルプログラム: 実践的な利用例

以下は、決済処理において、支払手段ごとの金額制限チェックを行うコード例です。

public class PaymentProcessor {
public static void main(String[] args) {
Object payment = 15000; // 決済金額の想定

// switch式とwhen句による条件絞り込み
String result = switch (payment) {
// Integer型かつ10000円未満の場合
case Integer amount when amount < 10000 -> “小口決済: 手数料無料”;

// Integer型かつ10000円以上の場合
case Integer amount when amount >= 10000 -> “大口決済: 手数料5%”;

// String型の場合の処理
case String s -> “不明な支払形式: ” + s;

// どの条件にも当てはまらない場合(デフォルト)
default -> “無効な値です”;
};

System.out.println(result);
}
}

応用・注意点: 現場で陥りやすい罠と対策

実務で活用する際は、以下の3点に注意してください。

1. 網羅性の確保: switch式は「網羅的」である必要があります。全ての可能性を網羅していない場合、コンパイルエラーとなります。Sealedクラス(封印されたクラス)と組み合わせることで、コンパイラに網羅性を強制させ、将来的な変更漏れを防ぐ設計が可能です。
2. when句の副作用: when句の中でメソッドを呼び出す場合、そのメソッドが副作用(状態変更)を持たないように設計してください。評価の順序に依存するコードは、バグの温床になります。
3. 可読性のバランス: when句を複雑にしすぎると、かえってif-elseの方が読みやすい場合があります。「条件が複数重なる場合は、個別のメソッドに切り出す」といったリファクタリングの意識を持つことが、保守性の高いコードへの近道です。

モダンなJava開発において、これらの機能を駆使することで、コードの「意図」をより明確に表現できるようになります。ぜひ日々の開発に取り入れてみてください。

コメント

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