Basit kompozisyon yerine zayıf referansların kullanılmasının daha iyi olacağı bir durum var mı?


10

Her ne kadar Java belgeleri Zayıf referansların öncelikle eşleştirmeleri standartlaştırmak için olduğunu belirtse de, internette WeakHashMap'in kullanım ömrü boyunca nesne meta verilerini depolamak için mükemmel olduğunu belirten birçok , çok , çok insan bulacaksınız . Ancak, hiç kimse anlaşılabilir VE uygun bir örnek vermekten rahatsız olmaz .

Nesne eklemek için WeakHashMap'i kullanmak veya bana sadece lanet şeyi kullanma isteğine dayanan keyfi bir karar gibi meta veri seslerini saklamak. Başka bir deyişle - kötü bir tasarım . Anlıyorum, kalıtımın mevcut olmayabileceği durumlar var (son sınıflar, arayüzler), ama kompozisyon ne olacak? Kompozisyonun bir seçenek olmayacağı bir örnek düşünemiyorum. Ve kesinlikle daha iyi olanı, çünkü "dil tuhaflığı" yerine köklü bir ilkeye dayanıyor.

Yani, basit kompozisyon yerine zayıf referansların kullanılmasının daha iyi olacağı bir durum var mı? Değilse, internetteki herkes neden yanlış yapıyor gibi görünüyor?


Mantık hatası: "... sadece lanet şeyi kullanma isteğine dayalı keyfi karar. Başka bir deyişle - kötü bir tasarım." Uçlar araçları haklı göstermeyebilir, ancak araçlar uçları kontrol etmek için yeterli değildir. Aynı yöntemler göz önüne alındığında, sonuç varsayımsal olarak iyi bir tasarım olabilir. Bu dava için tartışmasam da. :)
cwharris

3
Zayıf referanslar kompozisyon ve miras için dikey bir kavramdır.
Robert Harvey

Yanıtlar:


13

Diyelim ki bazı meta verileri bazı veri nesneleriyle ilişkilendirmem gerekiyor. Bu oldukça yaygın bir senaryodur. Veri nesnelerini kontrol etmiyorum ve bunların birçoğu var ve söz konusu API (geri aramalar, sanal yöntemler, vb.) Bana bu veri nesnelerini sunuyor, ancak meta verilerim olmadan. Bu nedenle, bu veri nesnelerinin her biri için bir durumu izlemem gerekiyor, yani daha önce gördüğüm ve tekrar görebilenler. Bu meta verilere, bazen bu kavram için kullanılan bir terim olan bir süsleme diyeceğim.

Basit kompozisyon, meta veri nesnesi tasarımını kontrol ettiğimden, doğrudan veri nesnesine bir referans koyabileceğimizi varsayarak, adorning nesnesinden (metadata sahip olan) diğer nesneye (veriye sahip olan) kolay arama sağlar. .

Ancak, veri nesnesinin tasarımını denetlemediğiniz ve değiştiremediğiniz sürece, basit kompozisyon geriye doğru arama sağlamaz (veri nesnesinden bazı meta verilere). Aslında, meta veri nesneleri koleksiyonunuz yoksa, bir nesne (veri) öğesi verilen ilişkili meta veri öğesini bile bulamazsınız.

Süsleyen meta verilerini bulmak için nesneden giden yöne doğru arama sorununa ek olarak, meta veri ömrü sorunu da vardır.

Veri nesnesi artık kullanılmasa bile biriken ve asla serbest bırakılmayan meta veriler bir bellek sızıntısıdır.

Zayıf bir referans hashmap her iki sorunu da çözer. Veriler verilen meta verilerin bulunmasına ve verilerin serbest bırakılmasından sonra meta verilerin serbest bırakılmasına izin verir.

Ayrıca, zayıf bir referans hashmap'in sadece (meta veri) değerlerinin geri kazanılmasına (gc'ed) değil, aynı zamanda (veri) anahtarlarının geri kazanılmasına (gc'ed) izin verdiğine dikkat edin, çünkü anahtarlar tutulursa, bellek sızıntısı ve dahası, değerler de asla serbest bırakılamaz.


Veri nesnelerini zayıf hashmap destekli meta veri tablosu ile kullanma neden kompozisyon olarak sayılmıyor?
Jack

2
@Jack, Kompozisyon, özellikle de en azından aklımdaki "basit kompozisyon", diğer nesnelere atıfta bulunan nesnelerdir, ancak doğrudan öyle. Kompozisyonun "has-a" ilişkisi basit bir referans veya bazen bir koleksiyon kullanılarak ifade edilir. Burada hashmap dolaylı bir yöntemdir. Eğer hashiniz yoksa süslemeye ulaşamazsınız. Oysa kompozisyonda bu navigasyonu yapabilirsiniz. Bu nedenle, bu meta veriyi kompozisyondan ziyade bir süsleme olarak adlandırmayı tercih ederim, ancak kesinlikle ilişkilidir. FWIW, süsleme (IMHO) veriyi oluşturuyor, tam tersi değil.
Erik Eidt

@Jack, re: benim son FWIW, sadece zayıf hashmap kullanırken, bellek tutma nedeniyle normalde meta veri süsleyen nesneden diğerine referans koyamayacağını (ya da zayıf bir referans olması gerekir). Bu nedenle, tipik olarak zayıf hashmap istemcisi, birbirleriyle etkili bir şekilde eşleştirilmiş olan ancak teknik olarak birbirleriyle nesne bileşiminde olmayan iki obje ile çalışır.
Erik Eidt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.