2012-09-17 37 views
2

我正在嘗試爲我的應用程序實現一個攔截器,這將能夠跟蹤它所看到的對象。我需要知道,我現在看到的對象是新東西還是重用的對象。跟蹤已經看到的對象

假設我有這樣一個接口:

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

我一直在想加入一個Set會跟蹤這些對象。但是由於我不想引起這種行爲的內存泄漏,也許我應該設計一些其他模式?最後,這些對象可能會在其他層被銷燬。

可能的解決方案似乎:

  • 把一個對象的hashCode入套
  • 使用WeakHashSet,而不是一個HashSet

第一選擇似乎不是100%可靠的,因爲的hashCode可能不獨特。至於第二個選項,我不確定這會阻止memleaks。

還有一點需要注意的是,我無法修改對象,我無法添加字段,方法。包裝也不是一種選擇。

任何想法?

回答

5

WeakReferences是要走的路。從here

弱引用,簡單地說,就是不夠強 強制的目的是保留在內存中的參考。弱引用允許你利用垃圾收集器的能力來確定你的可訪問性,所以你不必自己動手。

即保持WeakReference不會強制JVM保存對該對象的引用。

當然,弱引用是沒有強大到足以防止垃圾收集 ,所以你會發現(如果有到 部件沒有強引用)是weakWidget.get()突然開始返回null。

+0

請參閱上文。 get()方法會給你一個null –

1

只是完成了Brian Agnew的正確答案。沒有WeakHashSet類的Java API,你需要從WeakHashMap這樣創建:

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

Collections.newSetFromMap Java文檔。