単純な構成の代わりに弱参照を使用した方がよい状況はありますか?


10

が、Javaのドキュメントを指定し、その弱参照は、主にマッピングをcanonicalizingために、あなたが見つけるされている多くの多くの多くのWeakHashMapは、その存続期間中にオブジェクト・メタデータを格納するための完璧であることを、述べてインターネット上の人々を。ただし、誰もがわかりやすく適切な例を作成することに煩わされることはありません。

WeakHashMapを使用してオブジェクトにいくつかのプロパティを追加するか、メタデータサウンドを格納します。言い換えれば、悪いデザインです。継承が利用できない場合があることを理解しています(最終的なクラス、インターフェース)が、構成についてはどうですか?合成が選択肢にならない一例は考えられません。「言語の癖」ではなく、確立された原則に依存しているので、確かにより良いものです。

それでは、単純な構成の代わりに弱参照を使用した方がよい状況はありますか?そうでない場合、なぜインターネット上の誰もがそれを誤解しているように見えるのですか?


論理エラー:「...いまいましいものだけを使用するという意志に基づく任意の決定。つまり、悪いデザインです。」目的は手段を正当化しないかもしれませんが、手段は目的を論争するのに十分ではありません。同じ方法が与えられた場合、結果は仮想的には優れた設計になる可能性があります。この場合については、私はそれを主張しません。:)
cwharris 2017

3
弱い参照は、構成と継承に直交する概念です。
ロバートハーベイ

回答:


13

いくつかのメタデータをいくつかのデータオブジェクトに関連付ける必要があるとしましょう。これはかなり一般的なシナリオです。私はデータオブジェクトを制御していません。データオブジェクトはたくさんあります。問題のAPI(コールバック、仮想メソッドなど)はそれらのデータオブジェクトを提供しますが、メタデータは提供しません。したがって、これらのデータオブジェクトのそれぞれの状態を追跡する必要があります。このメタデータをアドーンメントと呼びます。これは、その概念で時々使用される用語です。

単純な構成により、装飾オブジェクト(メタデータを持つオブジェクト)から他のオブジェクト(データを持つオブジェクト)への簡単なルックアップが提供されます。メタデータオブジェクトのデザインを制御しているため、データオブジェクトへの参照を直接そこに入れることができるという前提があります。 。

ただし、データオブジェクトのデザインを制御して変更できる場合を除いて、単純な構成では逆参照(データオブジェクトから一部のメタデータへの参照)は提供されません。実際、メタデータオブジェクトのコレクションがない限り、オブジェクト(データ)アイテムが指定された関連メタデータアイテムを見つけることさえできません。

オブジェクトから付属のメタデータを見つける方向にルックアップする問題に加えて、メタデータの寿命の問題もあります。

蓄積され、データオブジェクトが使用されなくなっても解放されないメタデータは、メモリリークです。

弱参照ハッシュマップは両方の問題を解決します。これにより、データが指定されたメタデータを検索でき、データが解放された後のある時点でメタデータを解放できます。

さらに、弱参照ハッシュマップを使用すると、(メタデータ)値だけでなく(gc'ed)も再利用(gc'ed)することもできることに注意してください。メモリリーク、さらに、値も解放できませんでした。


弱いハッシュマップに裏付けられたメタデータテーブルを含むデータオブジェクトを構成として数えないのはなぜですか?
ジャック

2
@ジャック、コンポジション、特に少なくとも私の頭の中で「単純なコンポジション」は、他のオブジェクトを参照するオブジェクトですが、直接そうです。構成の「has-a」関係は、単純な参照、またはコレクションを使用して表現されます。ここで、ハッシュマップは間接的な方法です。ハッシュマップがないと、アドーンメントに到達できません。一方、コンポジションではこのナビゲーションを実行できます。したがって、私はこのメタデータを構成ではなく装飾と呼ぶことを好みますが、それらは確かに関連しています。FWIW、アドーンメントは(IMHO)でデータを構成しますが、その逆ではありません。
Erik Eidt 2017

@ジャック、再:私の最後のFWIW、弱いハッシュマップを使用する場合、メモリを保持しているため(または、方向、それは弱い参照でなければなりません)。そのため、通常、弱いハッシュマップクライアントは、互いに効果的にペアになっている2つのオブジェクトで機能しますが、技術的には互いにオブジェクトを構成していません。
エリックアイト2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.