0Pricing
Java Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. instanceof のパターンマッチング
  2. Record パターン
  3. ネストした Record パターン
  4. switch のパターン
← Java Academyに戻る