Getter の連鎖と NullPointerExceptions の処理
Getter 呼び出しの連鎖を実行してネストされたオブジェクトからデータを取得する場合は、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 チェックを自動的に処理します。
Optional doorknob = Optional.ofNullable(house)
.map(house -> house.getFloor(0))
.map(floorZero -> floorZero.getWall(WEST))
.map(wallWest -> wallWest.getDoor())
.map(door -> door.getDoorknob());
安全性とカプセル化
このアプローチにより、コードが簡素化されるだけでなく、型安全性も確保されます。 Optional クラスは、最初に null かどうかを確認せずに、そのクラスが表す値にアクセスしようとすると例外をスローします。さらに、参照するオブジェクトのメソッドに直接アクセスするだけなので、関係するクラスのカプセル化が維持されます。
結論
ただし、場合によっては、 LoD に違反する場合は、ゲッターを連鎖するときに if ステートメントの過度のネストを避けることが一般的に推奨されます。代わりに、Optional クラスを使用して、よりエレガントでタイプセーフな方法で null を処理することを検討してください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3