instanceof のパターンマッチング
型を検査しながら変数に束縛します。
「instanceof のパターンマッチング」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全4レッスンが含まれています。
instanceofのパターンマッチング
従来のinstanceofの使い方は、型を検査してからキャストする方法でした。パターンマッチングでは、検査とキャストを1つの手順にまとめ、検査に成功したときに型付き変数を束縛します。
従来の定型コード
従来のコードでは、型を確認してから新しい変数にキャストします。同じような記述が繰り返され、間違えやすい方法です。
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}
}
}新しい書き方
型パターンでは、変数をインラインで宣言します。たとえば、if (obj instanceof String s)のように記述します。条件がtrueになると、sにはすでにキャスト後の値が入っています。
public class Main {
public static void main(String[] args) {
Object obj = "hello";
if (obj instanceof String s) {
System.out.println(s.length());
}
}
}束縛される変数
変数sはパターン変数と呼ばれます。コンパイラーがパターンの一致を証明できる範囲でスコープに入るため、コードが短くなるだけでなく安全になります。
条件内での使用
同じif条件内では、&&の後でパターン変数を使用できます。その分岐では一致していることが保証されるためです。
public class Main {
public static void main(String[] args) {
Object obj = "developer";
if (obj instanceof String s && s.length() > 5) {
System.out.println("Long string: " + s);
}
}
}否定とフロースコープ
否定を使うと、スコープも適切に反転します。if (!(obj instanceof String s)) return;の後では、一致している場合にだけコードが続行されるため、メソッドの残りの部分で変数sを使用できます。
public class Main {
static int safeLength(Object obj) {
if (!(obj instanceof String s)) {
return -1;
}
return s.length();
}
public static void main(String[] args) {
System.out.println(safeLength("abc"));
System.out.println(safeLength(42));
}
}equalsのキャスト処理を置き換える
典型的な使用例は、equalsのオーバーライドをすっきり記述することです。1行で型の検査と変数の束縛を行い、その後でフィールドを比較します。
public class Main {
static final class Point {
final int x, y;
Point(int x, int y) { this.x = x; this.y = y; }
public boolean equals(Object o) {
return o instanceof Point p && p.x == x && p.y == y;
}
public int hashCode() { return x * 31 + y; }
}
public static void main(String[] args) {
System.out.println(new Point(1, 2).equals(new Point(1, 2)));
System.out.println(new Point(1, 2).equals(new Point(3, 4)));
}
}異なる型の処理
パターンを使った else if 分岐を連結すると、複数の型候補をきれいに振り分けられます。
public class Main {
static String describe(Object obj) {
if (obj instanceof Integer i) {
return "int " + (i * 2);
} else if (obj instanceof String s) {
return "string of length " + s.length();
} else {
return "unknown";
}
}
public static void main(String[] args) {
System.out.println(describe(21));
System.out.println(describe("hello"));
System.out.println(describe(3.14));
}
}null には決してマッチしない
instanceof パターンは、従来の演算子と同じく、null に対して false になります。そのため、パターン変数が null に束縛されることはなく、NPE のよくある原因を取り除けます。
public class Main {
public static void main(String[] args) {
Object obj = null;
if (obj instanceof String s) {
System.out.println("matched: " + s);
} else {
System.out.println("null or not a String");
}
}
}より簡潔で安全なコード
パターンマッチングを使うと冗長なキャストが不要になり、変数を誤って使えないようスコープも狭められます。しかも、ほとんど英語の文章のように読めます。現代の Java では推奨される書き方です。
組み合わせて使う
パターンを使ってさまざまな入力をフォーマットする、小さなディスパッチャーです。
public class Main {
static String format(Object o) {
if (o instanceof Double d) return String.format("%.1f", d);
if (o instanceof Integer i) return Integer.toString(i);
if (o instanceof String s && !s.isBlank()) return s.trim();
return "n/a";
}
public static void main(String[] args) {
System.out.println(format(3.14159));
System.out.println(format(99));
System.out.println(format(" spaced "));
System.out.println(format(null));
}
}理解度チェック
instanceof パターンの理解度を確認しましょう。
まとめ
instanceof のパターンマッチングについて学びました。
- 型チェックとキャストを1つの式にまとめられます。
- パターン変数のスコープは、マッチが確認された範囲に限定されます。
- パターンは null に対して false になり、NPE を回避できます。
- equals のオーバーライドや型による振り分けを簡潔にできます。
よくある質問
「instanceof のパターンマッチング」レッスンは無料ですか?
はい。「instanceof のパターンマッチング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全4レッスンが含まれています。
「instanceof のパターンマッチング」で何を学びますか?
型を検査しながら変数に束縛します。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Java Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「instanceof のパターンマッチング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このJava Academyレッスンでコードを書いて実行できますか?
はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- instanceof のパターンマッチング
- Record パターン
- ネストした Record パターン
- switch のパターン