4

ref.WeakReferenceインスタンスを別のref.WeakReferenceインスタンスと比較するにはどうすればよいですか?

組み込みのequalsメソッドは、簡単なチェックに失敗します。

import ref.WeakReference
val st : String = "qwerty"
val r1 : WeakReference[String] = new WeakReference(st)
val r2 : WeakReference[String] = new WeakReference(st)
r1 == r2
res1: Boolean = false

使用することは可能r1.get == r2.getですが、このメソッドは、破棄されたオブジェクトへの参照を比較するためには使用できません。どちらの場合も、Noneを取得し、NoneはNoneに等しくなります。

弱参照を実際に比較することは可能ですか?

4

1 に答える 1

3

問題は、オブジェクトが逆参照されたときに安全なデフォルトの動作がないことです。したがって、WeakReferenceはそれを提供するふりをしません。適切な動作を実装するオブジェクトでラップするのは簡単です。必要に応じて、暗黙的なものを提供し、型システムに、必要に応じて参照が正しい等しい動作でラップされるようにすることもできます。

したがって、簡単な答えは次のとおりです。これは、それについて考えないことからあなたを保護するために提供されていません。

編集(コメントへの応答):あなたはアイデンティティサービスを構築しています。これにより、エンティティへのすべての参照の存続期間中持続する必要があるエンティティ<->識別子のマッピングが維持されます。ほとんどの場合、エンティティとエンティティを表すオブジェクトは同じものです。これらの場合は、エンティティ- WeakHashMap[Entity,Identifier]>識別子のマッピングとWeakHashMap[Identifier,WeakReference[Entity]]識別子->エンティティのマッピングにを使用します(必要な場合のみ)。

エンティティがその識別子を参照している限り存続する必要がある場合は、必要に応じて識別子を転生できるシャドウ識別子を維持することでこれを行うことができます。そのため、次を使用し、参照キューを監視するシャドウで適切な転生ロジックWeakHashMap[Entity,Shadow[Identifier]WeakHashMap[Identifier, Tuple2[Shadow[Identifier],Entity]]ラップします。

ただし、ほとんどの場合、単純なアプローチでは不十分な場合は、外部化された識別子を追跡する必要があります。その時点で、問題は非常にトリッキーであり、解決しようとしている正確な問題に非常に敏感です。

于 2012-06-25T00:18:20.537 に答える