ForwardingMap の使用を理解するために頭を悩ませていますか? それを使用する可能性があるのはどのような場合ですか?
2 に答える
ForwardingXxx
クラスは、 を含むすべての JDK および Guava コレクションのデコレータ パターンMap
実装を提供します。
詳細については、Guava の wikiと、Effective Java 2nd Edition の Item 16: Favor composition over inheritance を参照してください。
要約すると、継承は強力ですが、カプセル化に違反するため問題があります。サブクラスとスーパークラスの間に真のサブタイプ関係が存在する場合にのみ適切です。それでも、サブクラスがスーパークラスとは異なるパッケージにあり、スーパークラスが継承用に設計されていない場合、継承は脆弱性につながる可能性があります。この脆弱性を回避するには、特にラッパー クラスを実装するための適切なインターフェイスが存在する場合は、継承の代わりに構成と転送を使用します。ラッパー クラスは、サブクラスよりも堅牢であるだけでなく、より強力です。
基本的に、実際の実装Map
に依存関係を追加することなく、拡張不可能な可能性のある s をカスタマイズできます。Map
デフォルトの Map クラスはすべて final です。つまり、それらを拡張することはできません。特別な動作をするマップを作成したい場合は、Map インターフェイス全体を実装し、すべてのメソッドを内部 Map に転送する独自のクラスを作成する必要があります。
ForwardingMap は、Map を実装してすべてを内部マップに転送する拡張可能なクラスであるため、これを簡単にします。つまり、拡張することで独自の Map 実装を作成できます。その場合、すべてのメソッドではなく、選択したメソッドのみを実装する必要があります。
ユースケースの 1 つは、入力したすべてのエントリを自動的に検証するマップや、データベースが変更されたときにデータベースを自動的に更新するマップなどです。