ホームページ >Java >&#&チュートリアル >Java 8 のオプション クラスはどのようにゲッターの連鎖を簡素化し、NullPointerExceptions を回避できるのでしょうか?
ゲッターの連鎖と NullPointerExceptions の処理
ネストされたオブジェクトからデータを取得するためにゲッター呼び出しの連鎖を実行する場合、null チェックを実行する必要があります。 NullPointerException を避けるため。これは、複数レベルのオブジェクトを扱う場合、すぐに冗長で不格好になる可能性があります。
If ステートメントのネスト
一般的なアプローチの 1 つは、if ステートメントをネストして、各オブジェクトをチェックすることです。続行する前に null のチェーンを実行してください。ただし、この方法は扱いにくく、保守が困難になる可能性があります。
デメテルの法則 (LoD) を破る
このアプローチはデメテルの法則 (LoD) に違反します。 は、メソッドが直接参照するオブジェクトの他のメソッドのみを呼び出す必要があることを示します。このメソッドは、直接のコンテキストを超えてオブジェクトにアクセスすることにより、関係するクラスのカプセル化に違反します。
Optional の使用 (Java 8)
幸いなことに、Java 8 では Optional クラスが導入されました。これは、ゲッターのチェーンで null を処理するための、よりエレガントでタイプセーフな方法を提供します。 Optional は、null の可能性がある値を表し、それに含まれる値をマッピングおよびフィルタリングするためのメソッドを提供します。
Optional.ofNullable でゲッターを連鎖させる
Optional を使用してゲッターを連鎖させるには、単純に呼び出します。チェーン内の最初のオブジェクトの Optional.ofNullable()。これにより、値または null を表す Optional オブジェクトが作成されます。その後、map() 操作をチェーンして値に getter 呼び出しを適用することができ、Optional が null チェックを自動的に処理します。
<code class="java">Optional<Doorknob> doorknob = Optional.ofNullable(house) .map(house -> house.getFloor(0)) .map(floorZero -> floorZero.getWall(WEST)) .map(wallWest -> wallWest.getDoor()) .map(door -> door.getDoorknob());</code>
安全性とカプセル化
これこのアプローチにより、コードが簡素化されるだけでなく、型の安全性も確保されます。 Optional クラスは、最初に null かどうかを確認せずに、そのクラスが表す値にアクセスしようとすると例外をスローします。さらに、参照するオブジェクトのメソッドにのみ直接アクセスするため、関連するクラスのカプセル化が維持されます。
結論
必要な場合もありますが、 LoD に違反する場合は、ゲッターを連鎖するときに if ステートメントの過度のネストを避けることが一般的に推奨されます。代わりに、Optional クラスを使用して、よりエレガントでタイプセーフな方法で null を処理することを検討してください。
以上がJava 8 のオプション クラスはどのようにゲッターの連鎖を簡素化し、NullPointerExceptions を回避できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。