Java 開発者が知っておくべき Java のパターン マッチングと変更の記録

王林
リリース: 2024-08-12 06:47:32
オリジナル
741 人が閲覧しました

Pattern Matching and Records Changes in Java  Every Java Developer Must Know

Java 16 のリリースでは、レコード (JEP 395) の導入による大幅な改善が導入され、主に使用されるクラスを宣言するためのよりシンプルかつ簡潔な方法が可能になりました。データを持ち運ぶために。この改善は Java 21 でさらに強化され、パターン マッチングとレコード (JEP 406) が追加されました。この新機能により、パターン マッチングを使用して、値が Record クラスのインスタンスであるかどうかをテストし、より効率的な方法でそのコンポーネントを抽出できるようになります。この記事では、Java 21 のパターン マッチングとレコードによってもたらされる変更と、それが Java 開発者にどのようなメリットをもたらすかを検討します。

データの透明なキャリアとして記録
Java 16 で導入されたレコードは、主にデータの保存と伝達に使用されるクラスです。これらは透過的なキャリアであり、主な目的はデータを保持することであり、コンストラクター、メソッド、equals/hashCode メソッドなどの他のすべての機能は、レコードで定義されたデータ フィールドに基づいてコンパイラーによって自動的に生成されます。そのため、データをシリアル化するかネットワーク経由で送信する必要があるシナリオでの使用に最適です。

2 つの X 座標と Y 座標を定義する Line クラスの例を考えてみましょう。

レコード Line(int x, int y) {}

このクラスを使用するには、Line クラスのインスタンスを作成し、組み込みコンポーネント アクセサー メソッド x() および y() を使用してそのデータ フィールドにアクセスするだけです。

行 line = new Line(0, 10);
int x = line.x();
int y = line.y();
System.out.println("X: " + x + ", Y: " + y); // 出力: X: 0、Y: 10

レコードとのパターンマッチング
Java 21 では、パターン マッチングが追加され、値が Record クラスのインスタンスであるかどうかをテストし、より効率的な方法でそのコンポーネントを抽出できるようになります。この機能は、レコードを広範囲に使用する大規模なコードベースを扱う場合に特に役立ちます。

オブジェクトが Line クラスのインスタンスであるかどうかをテストし、そのコンポーネントを抽出する次の例を考えてみましょう。

static void length(Object obj) {
if (行 l のオブジェクトインスタンス) {
int x = l.x();
int y = l.y();
System.out.println(y-x);
}
}
ご覧のとおり、型パターンを使用してオブジェクトが Point のインスタンスであるかどうかをテストし、そうであれば、組み込みのコンポーネント アクセサー メソッドを呼び出してそのコンポーネントを抽出しました。このコードは機能しますが、Java 21 のレコード パターンを使用するとさらに簡素化できます。

レコード パターンを使用すると、値が Record クラスのインスタンスであるかどうかをテストできるだけでなく、1 行のコードでそのコンポーネントを抽出することもできます。これは、抽出されたコンポーネントのローカル変数の宣言をパターン自体にリフトし、値がパターンと一致したときにアクセサー メソッドを呼び出してそれらの変数を初期化することによって実現されます。

レコード パターンを使用する次のコードを考えてみましょう:

static void length(Object obj) {
if (obj instanceof Line(int x, int y)) {
System.out.println(y-x);
}
}
このコードははるかに簡潔で読みやすくなっています。新しいオブジェクトを作成し、そのコンポーネントのアクセサー メソッドを呼び出してデータを取得する必要がなくなりました。レコード パターンはコンポーネントを直接抽出して初期化し、コードをより合理化します。

ネストされたレコード パターン
開発者が直面する大きな課題の 1 つは、複雑なオブジェクト グラフを扱い、そこからデータを抽出することです。ここで、パターン マッチングの真の力が発揮されます。パターン マッチングを使用すると、エレガントにスケーリングし、より複雑なオブジェクト グラフを照合できるようになります。

次のクラスについて考えてみましょう: 従業員、部門 (列挙)、および会社 (レコード)。レコード パターンを使用して、会社オブジェクトから従業員の部門を抽出できます。

// Java 21 以降
static void printEmployeeDepartment(会社 c, 文字列名) {
if (c instanceof Company(Department dept, List 従業員)) {
for (従業員 e : 従業員) {
if (e.getName().equals(name)) {
System.out.println(name + " は " + dept + " 部門にあります。");
戻る;
}
}
}
System.out.println(名前 + " 見つかりません。");
}
この例では、ネストされたパターンを使用して、Company オブジェクトから従業員の部門を抽出しています。指定された Company オブジェクトに部門と従業員のリストがあるかどうかを確認し、リストをループして指定された名前の従業員を見つけます。従業員が見つかった場合は、その部署を印刷します。そうでない場合は、従業員が見つからなかったというメッセージを出力します。

ネストされたパターンは、複数の値を一度に照合して分解する必要がある状況でも使用できます。指定された座標が四角形の内側にあるかどうかを確認する次の例を考えてみましょう:

//Java 21 以降
レコードポイント(double x, double y) {}

レコード Rectangle(左上点、右下点) {}

// 指定された点が指定された四角形の内側にあるかどうかを確認します
static boolean isPointInsideRectangle(Point p, Rectangle r) {
if (r インスタンスオブ Rectangle(Point(var x1, var y1), Point(var x2, var y2))) {
if (p.x() > x1 && p.y() > y1 && p.x() true を返します;
}
}
false を返します;
}

この例では、ネストされたパターンを使用して、特定の Point オブジェクトが特定の Rectangle オブジェクトの境界内に収まるかどうかをチェックしています。ネストされたパターンを使用すると、複数行のコードを記述することなく、長方形の左上と右下の点の x 座標と y 座標にアクセスできます。

結論として、Java 21 にパターン マッチングとレコード (JEP 406) が追加されたことで、複雑なオブジェクトからデータを処理および抽出する方法が大幅に改善されました。この機能によりコードが大幅に簡素化され、より読みやすく簡潔になります。また、パターン一致が失敗する可能性がある失敗シナリオの処理にも役立ちます。これらの変更により、Java 21 では引き続きコードがより合理化され、Java 開発者の開発エクスペリエンスが向上します。

MyExamCloud の Java SE 21 Developer Professional Practice Tests で Java 21 スキルをアップグレードしてください。 Java 21 エキスパートになるための知識を開発し、テストしてください。

以上がJava 開発者が知っておくべき Java のパターン マッチングと変更の記録の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート