【Java学習|実務向け】Java 21以降の必須知識:Unconditional Pattern(無条件パターン)で変える条件分岐の書き方

1. 導入:なぜ今、Unconditional Patternなのか

Java 16から導入が始まったパターンマッチング機能は、Java 21の正式リリースでついに完成形に近づきました。特に「無条件パターン(Unconditional Pattern)」は、従来のinstanceofによるキャスト地獄や、switch文における型チェックの冗長さを劇的に解消する強力な武器です。
本記事では、この無条件パターンを活用し、可読性と安全性を両立した制御フローの設計手法を解説します。

2. 基礎知識:無条件パターンとは何か

無条件パターンとは、パターンマッチングにおいて「必ず一致する(マッチする)」パターンのことです。最も代表的なものは `case Object o` や、単純な変数宣言を伴うパターンです。
従来の `if (obj instanceof String s)` は「String型の場合のみ」という条件付きでしたが、無条件パターンを `switch` 文で使うと、あらゆる型を受け入れつつ、同時に変数をスコープ内に定義できるため、コードの記述量が大幅に削減されます。

3. 実装と解決策:switch式での活用

以前のJavaでは、型判定のたびに `if-else` を重ねる必要がありましたが、Java 21からの `switch` 式では、パターンマッチングと `sealed class`(シールクラス)を組み合わせることで、網羅性をコンパイラが保証してくれます。無条件パターンは、その「デフォルトケース」としての役割を担いつつ、変数の型変換も同時に行います。

4. サンプルプログラム

以下のコードは、異なる型の入力を受け取り、処理を分岐させる実務的な例です。

public class PatternMatchingExample {

public static void main(String[] args) {
Object input = “Java 21 Feature”;
System.out.println(formatValue(input));
}

public static String formatValue(Object obj) {
// switch式を使用し、パターンマッチングを適用
return switch (obj) {
case Integer i -> “数値: ” + (i 2); // Integer型にマッチ
case String s -> “文字列: ” + s.toUpperCase(); // String型にマッチ

// これが無条件パターン。
// どんなオブジェクトでもマッチし、変数 o として扱える。
// defaultラベルの代わりとして、かつ変数を利用できる点が強力。
case Object o -> “その他の型: ” + o.getClass().getSimpleName();
};
}
}

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

実務で無条件パターンを使用する際は、以下の2点に注意してください。

1. 網羅性のチェック(Exhaustiveness)
`switch` 式では、すべてのケースを網羅する必要があります。無条件パターン(`case Object o`)を記述すると、それが「どんな型にもマッチする」ため、それ以降の `case` は到達不能コードとなり、コンパイルエラーになります。必ず一番最後に記述してください。

2. nullの扱い
Javaの `switch` 式は、明示的に `case null` を書かない限り、`null` が渡されると `NullPointerException` をスローします。無条件パターン `case Object o` は `null` にもマッチするため、`null` を特別なロジックで処理したい場合は、必ず `case null` を別個に定義してください。

無条件パターンを使いこなすことで、型変換の安全性(Type Safety)が高まり、保守性の高いクリーンなコードが実現できます。ぜひ明日からの実装に取り入れてみてください。

コメント

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