導入
皆さんは、Javaでオブジェクトの型を確認する際、いまだに「instanceofによるチェック」と「その後の明示的なキャスト」を書いていませんか?この冗長な記述は、コードの可読性を下げるだけでなく、キャスト忘れなどのバグを生む原因にもなります。Java 16から導入され、Java 21で正式仕様となった「パターンマッチング」を活用することで、型チェックとキャストを同時に行い、安全で簡潔なコードを書くことが可能です。今回は、この「Type Test Pattern」の基本と実用的な活用法を解説します。
基礎知識
「Type Test Pattern」とは、instanceof演算子の拡張機能です。従来のinstanceofは「そのオブジェクトが特定の型であるか」を判定するだけでしたが、パターンマッチングを用いると、型が一致した場合にそのまま変数へキャストし、その変数を利用できるようになります。
従来の書き方では、instanceofで確認した後に、わざわざ「(String) obj」のようにキャストして代入するステップが必要でした。この新しい構文は、この「判定」と「変換」の二重の手間を排除します。
実装/解決策
実装は非常にシンプルです。instanceofの後に、型名と変数名を記述します。もしオブジェクトがその型であれば、指定した変数にキャストされた値が代入され、if文のスコープ内で即座に使用可能になります。
サンプルプログラム
以下のコードは、Object型の引数を受け取り、それがString型であれば文字数を表示し、Integer型であれば2倍にして表示する例です。
public class PatternMatchingSample {
public static void main(String[] args) {
processObject("Hello Java");
processObject(100);
}
public static void processObject(Object obj) {
// instanceofの直後に変数名を指定することで、キャストが自動的に行われます
if (obj instanceof String str) {
// ここではstrはString型として安全に扱えます
System.out.println("文字列の長さ: " + str.length());
} else if (obj instanceof Integer num) {
// ここではnumはInteger型として安全に扱えます
System.out.println("数値の2倍: " + (num 2));
} else {
System.out.println("未知の型です");
}
}
}
応用・注意点
このパターンマッチングには、いくつか押さえておくべき現場のテクニックがあります。
1. スコープの理解
パターン変数(上記の例でいうstrやnum)は、if文の条件がtrueであるスコープ内でのみ有効です。elseブロック内では使用できない点に注意してください。
2. nullチェックの自動化
instanceofの優れた点として、対象がnullの場合、自動的にfalseを返してくれることが挙げられます。そのため、別途nullチェックを行う必要がなく、NullPointerExceptionを防ぐ安全なコードになります。
3. 複雑な条件との組み合わせ
if (obj instanceof String str && str.length() > 5) のように、論理演算子と組み合わせることも可能です。右辺の評価時にはstrがすでにキャスト済みであるため、非常に自然な流れで記述できます。
まずは既存のコードにある「instanceof後のキャスト」を見つけたら、このパターンに書き換えてみてください。それだけで、Javaのコードが驚くほどモダンでクリーンになるはずです。

コメント