Gönderen Java Koleksiyonları API Tasarım SSS :
Harita neden Koleksiyonu genişletmiyor?
Bu tasarım gereğiydi. Eşlemelerin koleksiyon olmadığını ve koleksiyonların eşleme olmadığını düşünüyoruz. Bu nedenle, Harita'nın Koleksiyon arayüzünü genişletmesi (veya tersi) çok az mantıklıdır.
Bir Harita Koleksiyonsa, öğeler nelerdir? Tek makul cevap "Anahtar / değer çiftleri" dir, ancak bu çok sınırlı (ve özellikle yararlı olmayan) bir Harita soyutlaması sağlar. Belirli bir anahtarın hangi değerle eşleştiğini soramazsınız veya belirli bir anahtarın girdisini hangi değerle eşlendiğini bilmeden silebilirsiniz.
Harita'yı genişletmek için toplama yapılabilir, ancak bu şu soruyu gündeme getirir: anahtarlar nelerdir? Gerçekten tatmin edici bir cevap yok ve birini zorlamak doğal olmayan bir arayüze yol açıyor.
Haritalar Koleksiyonlar (anahtarlar, değerler veya çiftler) olarak görüntülenebilir ve bu gerçek Haritalar'daki üç "Koleksiyon görünümü işlemleri" ne (keySet, entrySet ve değerler) yansıtılır. Prensip olarak, bir Listeyi bir harita eşleme indeksi olarak öğelere görüntülemek mümkün olsa da, bu bir öğeyi Listeden silmenin silinen öğeden önceki her öğeyle ilişkili Anahtarı değiştirdiği kötü bir özelliğe sahiptir. Bu yüzden Listeler üzerinde harita görüntüleme işlemimiz yoktur.
Güncelleme: Bence alıntı soruların çoğuna cevap veriyor. Özellikle yararlı bir soyutlama olmadığı bir giriş koleksiyonu hakkındaki kısmı vurgulamakta fayda var. Örneğin:
Set<Map.Entry<String,String>>
izin verir:
set.add(entry("hello", "world"));
set.add(entry("hello", "world 2");
( entry()
birMap.Entry
örnek )
Map
s benzersiz anahtarlar gerektirir, böylece bu bunu ihlal eder. Veya bir Set
girişe benzersiz anahtarlar uygularsanız , bu Set
genel anlamda bir anahtar değildir . Daha Set
fazla kısıtlama ile bir.
Tartışmalı bir şekilde equals()
/ hashCode()
ilişki için Map.Entry
sadece anahtar olduğunu söyleyebiliriz ama hatta sorunları vardır. Daha da önemlisi, gerçekten herhangi bir değer katıyor mu? Köşe vakalarına bakmaya başladığınızda bu soyutlamanın bozulduğunu görebilirsiniz.
HashSet
Aslında bir olarak uygulandığını HashMap
, başka bir şekilde değil, dikkat çekiyor . Bu sadece bir uygulama detayıdır, ancak yine de ilginçtir.
Var entrySet()
olmanın ana nedeni, geçişi basitleştirmektir, böylece anahtarları geçmeniz ve ardından anahtar araması yapmanız gerekmez. A'nın girişler Map
olması gerektiğine dair prima facie kanıtı olarak kabul etmeyin Set
(imho).