SORU
16 NİSAN 2010, Cuma


Neden't Java Göster Toplama uzanır değil mi?

Map<?,?> Collection<?> olmadığı gerçeği beni şaşırttı.

Eğer böyle bir ilan olsaydı ÇOK mantıklı olduğunu düşündüm:

public interface Map<K,V> extends Collection<Map.Entry<K,V>>

Tüm bunlardan sonra, Map<K,V> Map.Entry<K,V>, bir koleksiyonu bir değil mi?

Bu yüzden uygulanan değil neden iyi bir nedeni var mı?


Teşekkürler Cletus için en güvenilir cevap, ama ben hala merak ediyorum neden, sen zaten görünüm Map<K,V> Set<Map.Entries<K,V>> () entrySet()), değil sadece uzatmak arayüzü yerine.

Map eğer bir unsurların neler olduğunu 12**? Tek mantıklı cevap "Anahtar-değer çiftleri"

Tam olarak, interface Map<K,V> extends Set<Map.Entry<K,V>> çok iyi olurdu!

ama bu çok sınırlı ve özellikle yararlı) Map bir soyutlama sağlar.

Ama eğer durum bu neden entrySet arabirim tarafından belirtilen zaman? Yararlı bir şekilde (ve kolayca bu pozisyon için söylenecek pek bir şey yok sanırım!) olmalı.

Belirli bir anahtar için haritalar ne soramazsın, ne eşler ne olduğunu bilmeden verilen bir anahtar için girdiyi sil.

Bunun için 16 ** tek sey demiyorum! Vegerekirtüm diğer yöntemler (gereksiz şimdi hangi entrySet hariç) devam et!

CEVAP
16 NİSAN 2010, Cuma


Java Collections API Design FAQ:

Neden Toplama Göster uzatmak değil mi?

Bu tasarım tarafından yapıldı. Hissediyorum eşleştirmeleri koleksiyonları ve koleksiyon değil eşlemeleri. Böylece, uzatmak Göster için pek bir anlam ifade etmiyor Toplama arabirimi (veya Yardımcısı versa).

Eğer bir Harita Koleksiyonu ise, ne elemanlar? Tek mantıklı cevap "Anahtar-değer çiftleri", ama bu çok sınırlı (ve değil sağlar özellikle yararlı) Harita çıkarma. Belirli bir anahtar değeri ne isteyemezsin Haritalar için, ne de girişi silebilirsiniz belirli bir anahtar için ne bilmeden değeri eşleştirir.

Koleksiyonu genişletmek için yapılmış olabilir Göster, ama bu soruyu akla getiriyor: anahtarları nelerdir? Hayır gerçekten var tatmin edici bir cevap ve bir zorlama doğal olmayan bir arayüz çıkıyor.

Haritalar Koleksiyon olarak görülebilir ( anahtarlarını, değerler, veya çift), ve bu aslında üç "Toplama yansıtılır "Haritalar (anahtar kümesi,üzerinde işlem görüntüleyin entrySet, ve değerleri). İçinde iken prensip, mümkün bir Listesini görmek için öğeleri Göster bir eşleme endeksleri, bu kötü bir özellik vardır listeden bir öğe silmek Anahtar değiştirir her ile ilişkili silinmiş öğe önce öğesi. Harita görünümü yok yüzden Listeler üzerinde işlem.

Güncelleme:Alıntı sorulara cevaplar sanırım. Girişleri koleksiyonu kısmını vurgulayarak özellikle yararlı bir soyutlama değil varlık değer. Örneğin:

Set<Map.Entry<String,String>>

izin verir:

set.add(entry("hello", "world"));
set.add(entry("hello", "world 2");

(Map.Entry bir örnek oluşturur entry() bir yöntem varsayarak)

Maps Bu ihlal edecek kadar benzersiz anahtarları gerektirir. Ya girişleri Set bir benzersiz anahtarları empoze Eğer, gerçekten Set genel anlamda değil. A Set daha fazla kısıtlama var.

Muhtemelen Map.Entry */hashCode() *26 ilişkiyi tamamen anahtar biriydi. ama bu da sorunları var diyebiliriz. Daha da önemlisi, gerçekten herhangi bir değer katıyor mu? Bu soyutlama köşe davalara bakmaya başladığınızda ayırır bulabilirsiniz.

HashSet aslında HashMap, başka yolu yok gibi uygulanan fazlalaştı. Bu tamamen uygulama bir detay ama ilginç yine de.

entrySet() ana nedeni var gerek yok yani Çapraz geçiş traverse anahtarları basitleştirmek ve anahtarın bir arama yapın. Map girişler (ımho) Set olması ilk bakışta delil olarak kabul etme.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Cumia

    Anthony Cumi

    5 EYLÜL 2006
  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • THE RED DRAGON

    THE RED DRAG

    6 ŞUBAT 2009