2

アプリケーションにインターセプターを実装しようとしています。これにより、見たオブジェクトを追跡できます。今見ている物体が新しいものなのか、それとも再利用されたものなのかを判断できる必要があります。

次のようなインターフェースがあるとします。

public interface Interceptor {
    void process(Object o);
}

これらのオブジェクトを追跡するセットを追加することを考えていました。でも、そのような振る舞いでメモリリークを起こしたくないので、別のパターンを考えた方がいいのではないでしょうか? 最終的に、これらのオブジェクトは他のレイヤーで破棄される可能性があります。

考えられる解決策は次のとおりです。

  • オブジェクトの hashCode を Set に入れる
  • HashSet の代わりに WeakHashSet を使用する

hashCode が一意ではない可能性があるため、最初のオプションは 100% 信頼できるとは言えません。2番目のオプションについては、これがメモリリークを防ぐかどうかはわかりません。

もう 1 つ注意してください。オブジェクトを変更することはできません。フィールドやメソッドを追加することはできません。ラッピングも不可です。

何か案は?

4

2 に答える 2

5

WeakReferences行く方法です。ここから:

弱い参照とは、簡単に言えば、オブジェクトを強制的にメモリに残すほど強くない参照です。弱参照を使用すると、ガベージ コレクターの機能を利用して到達可能性を判断できるため、自分で行う必要はありません。

つまり、保持してWeakReferenceも、JVM がこのオブジェクトへの参照を保持することは強制されません。

もちろん、弱い参照はガベージ コレクションを防ぐほど強力ではないため、(ウィジェットへの強い参照がない場合)we​​akWidget.get() が突然 null を返し始めることがあります。

于 2012-09-17T14:21:42.757 に答える
1

ブライアン・アグニューの正解まであと少し。Java API にはクラスがありません。次のようWeakHashSetに作成する必要があります。WeakHashMap

Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

Collections.newSetFromMap Java ドキュメントを参照してください。

于 2012-09-17T14:42:31.903 に答える