2017-12-25 10 views
1

そのタイトルの意味を理解することは本当に難しいことですが、説明しようとします。Bオブジェクトへの参照を保持しているすべてのAオブジェクトにBオブジェクトが削除されたことを通知する

私たちは、name,surname、などのさまざまなフィールドを保持するクラスPersonを持っています。これらは、任意の与えられたPersonのユニークな特性です。ただし、Personには、Houseという別のオブジェクトを参照するフィールドがあります。一部の人々はそれを持っています。つまり、Houseオブジェクト参照を意味します。他のものは、Nullオブジェクト参照を意味します(それについてはご注意ください)。もう1つは、同じ家に住んでいる人がいると仮定しているということです。異なる家から同じHouseへの複数の参照を意味します。Personここまでは順調ですね。

今、私たちは火のAsteroid物体が空を飛んで来て、Personオブジェクトの多くが住んで美しいマルチ階建てHouseオブジェクトを、難破船状況にあります。 Asteroidはこの建物へのオブジェクト参照をTownで使用し、Nullに設定します。しかし、貧しい人々Personオブジェクトはまだ彼らがHouseを持っていると思う:Houseの参照はTownのレベルでのみ変更されたので、それはまだメモリ内にあり、すべての居住者はそれを参照しています。つまり、ガベージコレクタはHouseオブジェクトを取り除くことができず、Personオブジェクトは依然として疑似既存のHouseを使用できます。

私は今考えている質問は明らかです。どのようにこのような状況に対処するべきですか?存在する場合しない場合、falsetrueを、そしてPersonがかつて彼らのHouseたクレーターに来るときそのようなオブジェクトはもう存在しないため、彼らは、Nullへの参照を設定します。

は、私はいくつかのbooleanフラグを使用するのではと思いました。それは解決策を提供しますが、すべての居住者がHouseが存在しないことを確認したわけではないので、ガベージコレクタはオブジェクトを取り除くことができません。

Houseオブジェクトには、すべてPersonオブジェクトが存在することが考えられます。 Houseが破壊された後、すべての参照をNullに設定し、配列全体を反復します。今ではガベージコレクタはオブジェクトを簡単に取り除きますが、これは高価になる可能性があります。超高層ビルの場合はどうなりますか?

他の可能性はありますか?

+1

その場合、スタックから 'House'または' Person'までのオブジェクトパスは何ですか? –

+0

私は家のオブジェクトの家に住んでいる人への参照が最高だと思うし、あなたは人にnull.Orに家を設定するか、または人と人をリンクするためにマップを使用することができます、人の中で –

+2

マップpersonH​​ouse >このように、あなたの2つのクラスは、それ自体では互いに疎結合ではありません –

答えて

2

あなたが言ったように、ハウスでフラグを使用できます。 ガベージコレクタの問題を解決するには、HouseとPersonを WeakReferenceまで配線してください。 オブジェクトには弱い受信参照しかない場合、ガベージコレクションの対象となります。

+0

ガベージコレクタが実行され、弱参照をクリアするタイミングを制御できないことに注意してください。したがって、「家」は破壊されていると警告することは避けられない。 – Holger

0

もう1つの解決策は、Houseオブジェクトには、その中に存在するすべてのPersonオブジェクトへの参照の配列があることがあります。ハウスが破壊された後、私たちはすべての参照をNullに設定し、配列を反復処理します。今ではガベージコレクタはオブジェクトを簡単に取り除きますが、これは高価になる可能性があります。超高層ビルの場合はどうなりますか?

コストがかかる可能性がありますが、全体的なコストはそれほど増加しません。

あなたの超高層ビルが長さNのリストを持っている場合は、N人がそれを参照しています。つまり、参照の総数が2倍になっただけです。

時間に関しては、ほぼ同じです:N個の参照を消去する必要がありますが、これらの参照は以前に設定されている必要があります。もう一度、あなたは仕事を倍増させています。

倍音が重なって聞こえますが、おそらく小さな値を倍増しています。

WeakReferenceも無料ではありません。 Houseへの通常の参照を弱い参照に置き換えることは、もう1つのオブジェクトを意味します。これは、(強い)参照よりもコストがかかります。

メモリを節約したい場合は、List<Person>Houseに保存するよりも、確かに良い方法です。

また、このようなリストを持つことの利点もあります。このリストは1日役に立つかもしれません。前方と後方参照を常に同期させなければならないので、冗長性は悪いです。

関連する問題