2014-04-26 77 views
0

比方說,我有一個參考的樹,看起來就像是:在這種情況下會收集對象嗎?

root => WeakHashMap<View, Binder> => Binder => View 
// by WeakHashMap I mean keys (Views) are referenced by WeakReferences 
// View is only referenced by Binder 

威爾View(和Binder)得到收集?或從BinderView的參考也必須弱?

這就是它的外觀在代碼:

class SomeClass { 
    private static final Map<View, Binder> binders = new WeakIdentityHashMap<>(); 
    // (...) 
} 

class Binder { 
    private final View target; 

    public Binder(View target) { 
     this.target = target 
    } 
    // (...) 
} 
+0

如果您給出了一個實際的例子,而不是僅僅描述它,那麼理解這個問題會相當容易。 –

+0

任何對象的強引用都會使其保持活動狀態。 –

回答

2

http://docs.oracle.com/javase/7/docs/api/java/util/WeakHashMap.html

實現注意事項:WeakHashMap中的值對象由普通 強引用舉行。因此,應該注意確保值對象不直接強烈地引用它們自己的密鑰,或者直接地或者間接地引用它們,因爲這將防止密鑰被丟棄。 請注意,值對象可能通過 WeakHashMap本身間接引用其密鑰;也就是說,一個值對象可能強烈地指代一些其他關鍵對象,其關聯對象的價值依次強烈地 引用第一個值對象的關鍵字。如果地圖 中的值不依賴於對其持有強引用的地圖,則處理此操作的一種方法是在插入之前將值本身包含在WeakReferences 之內,如下所示:m.put(key,new WeakReference(value ))和 ,然後解開每個得到。

至於WeakReference的從價值的關鍵:

是。

http://docs.oracle.com/javase/7/docs/api/java/lang/ref/package-summary.html#reachability

的對象是弱可及,如果它既不強烈,也不輕聲 到達,但通過遍歷弱引用可以到達。當對弱可達對象的弱引用被清除時,對象 有資格完成。

+0

將'WeakReference'鍵入'Binder'允許收集? – mrpyo

+1

@mrpyo更新了答案。 – rpg711