2010-11-17 14 views
6

Bir soket üzerinden Protokol Arabelleklerini kullanarak bir düğüm ağacı alan bir Scala sunucusuna sahibiz ve her bir düğüme ek veriler eklememiz gerekiyor.Guava MapMaker(). ZayıfKeys() makeMap() vs WeakHashMap

Tek bir iş parçacıklı bağlamda ve hem düğüm ağacı hem de ilişkili verilerin güçlü referansları aynı anda kaldırıldığında (kapsam dışına çıktığından), Google Guava'nın MapMaker uygulamasını zayıfKeylerle kullanmak için herhangi bir neden var mı () WeakHashMap kullanarak? MapMaker ile, bu durumda gerekli olmayan senkronize erişim için ödediği görülüyor. Bir kenara göre, MapMaker'ın eşdeğerlik ayarlarına erişim sağlamak için bir referans eşitliği seçmesi ancak zayıf veya yumuşak referanslar ile ilgilenmemesi yararlı olacaktır.

cevap

6

WeakHashMap no'lu önemli bir olumsuzluk, "kimlik haritası" olmamasıdır. Bu, zayıf tuşlar için gerçekten anlamsız olan tuşlarda equals() ve hashCode (ve identityHashCode yerine) kullanır. Anahtarlarınızın equals yönteminde kimlik eşitliğini kullandığından emin olarak bu hatayı giderebilirsiniz.

+0

Teşekkürler Laurence, Javadoc'u hızla taradım ve bunun == ve identityHashCode kullanılarak uygulanacağını kabul ettim, ancak daha yakın bir okuma yapmak açıklamanızla eşleşiyor. –

+0

Ayrıca, hala java.util.HashMap kullanabilir ve tek bir T içeren özel bir ReferenceEquivalence yazabilir ve == ve identityHashCode kullanır? –

+0

Yapabilirsin, fakat ölü anahtarlarını "HashMap" den temizlemek için bir şeye ihtiyacın olacak. Bir kenara bakarsak, bu kodu inceleyerek doğrulamamıştım, fakat ölü anahtarların/değerlerin kaldırılmasının MapMaker'ın bir ConcurrentMap işlevini kullanmasının bir parçası olup olmadığını merak ediyorum. –