【Java学習|豆知識】Java 21以降でさらに強力に!Guarded Patterns(ガード付きパターン)で複雑な条件分岐をスマートに書く

導入:なぜGuarded Patternsが必要なのか

Java 16で導入された「instanceofのパターンマッチング」によって、キャストの記述が不要になり、コードは非常にスッキリしました。しかし、実務では「型が一致すること」に加え、「その値が特定の範囲内であること」といった追加条件が必要なケースが多くあります。これまではif文をネストさせて対応していましたが、Guarded Patterns(ガード付きパターン)を使えば、これを1行で簡潔に記述でき、可読性と安全性を大きく向上させることができます。

基礎知識:Guarded Patternsとは

Guarded Patternsは、パターンマッチングにおいてwhen句を用いて追加の条件式を指定する仕組みです。Java 21で正式に導入されました。
通常、instanceofで型を確認した後に「さらに値をチェックしたい」場合、従来は以下のように書いていました。

従来の書き方:
if (obj instanceof String s && s.length() > 5) { … }

これ自体も悪くありませんが、switch式やswitch文と組み合わせることで、より強力な条件分岐が可能になります。

実装:when句による追加条件

switch式の中で、caseラベルの後にwhenキーワードを記述することで、パターンマッチングに条件式を追加できます。これにより、単なる型チェックだけでなく、論理演算や比較演算を組み合わせた高度な分岐が可能です。

サンプルプログラム

以下のコードは、入力されたオブジェクトの型と値に応じて処理を分ける例です。そのままコピーして動作確認が可能です。

import java.util.List;

public class GuardedPatternExample {
public static void main(String[] args) {
List inputs = List.of(10, 100, “Java”, “LongString”, 3.14);

for (Object obj : inputs) {
String result = switch (obj) {
// Integer型かつ10より大きい場合
case Integer i when i > 10 -> “10より大きい整数: ” + i;
// Integer型(それ以外)
case Integer i -> “10以下の整数: ” + i;
// String型かつ長さが5文字より大きい場合
case String s when s.length() > 5 -> “長い文字列: ” + s;
// String型(それ以外)
case String s -> “短い文字列: ” + s;
// それ以外の型
case null, default -> “対象外またはnull”;
};
System.out.println(result);
}
}
}

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

1. 評価順序の重要性
switch文でのパターンマッチングは、上から順に評価されます。より限定的な条件(例: i > 100)を先に、広義の条件(例: i > 0)を後に記述しないと、意図した分岐に入らないことがあります。順序には十分注意してください。

2. 副作用のあるコードを避ける
when句の中には、なるべく副作用(変数の書き換えやログ出力など)を含めないようにしましょう。条件式はあくまで「真偽判定」のための純粋な式であるべきです。

3. nullの扱い
Java 21のパターンマッチングでは、明示的にnullケースを指定できます。nullを考慮した堅牢な設計(NullPointerExceptionを未然に防ぐ)を意識することで、より安全なコードになります。

Guarded Patternsを使いこなすことで、複雑なif-elseの羅列から解放され、宣言的でメンテナンス性の高いJavaコードを実現しましょう。

コメント

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