Değişmez haritalar, listeler, kümeler veya diğer koleksiyon türlerini kullanmayı tercih edeceğiniz birkaç durum vardır.
İlk ve tartışmasız en önemli kullanım örneği, bir sonuç kümesini (veya listeyi veya haritayı) döndürecek bir sorgunun veya hesaplamanın sonucunu döndürdüğünüzde, değiştirilemez veri yapıları kullanmayı tercih etmelisiniz.
Bu durumda, bunun bir değişmez versiyonunun gerçek değişmezliğini çok daha net bir şekilde yansıttığı için bunların değişmez sürümlerini döndürmeyi tercih ederim - daha sonra verilerle ne yaparsanız yapın, sorgunuzdan aldığınız sonuçların seti değişiklik.
İkinci yaygın kullanım durumu, bir yönteme veya hizmete girdi olarak bir bağımsız değişken sağlamanız gerektiğidir. Giriş koleksiyonunun hizmet veya yöntemle (genellikle gerçekten kötü bir tasarım fikri olan) değiştirilmesini beklemediğiniz sürece , değiştirilebilir bir koleksiyon yerine değişmez bir koleksiyona geçmek birçok durumda makul ve güvenli bir seçim olabilir.
Bunu "değere göre geç" kuralı olarak düşünüyorum .
Daha genel olarak - veri modülü veya hizmet sınırlarını aştığında değişmez bir veri yapısı kullanmak mantıklı bir uygulamadır. Bu, (değiştirilemez) giriş / çıkış ile değişken iç durum arasındaki farkların anlaşılmasını kolaylaştırır.
Bunun çok faydalı bir yan etkisi olarak modüllerinizin / servislerinizin güvenliği ve diş güvenliği artar ve endişelerin daha net ayrılmasını sağlar.
Collections.empty*()Yöntemleri kullanmanın başka bir iyi nedeni , dikkat çekici ayrıntı eksikliği. Java7 öncesi dönemde, genel bir koleksiyonunuz varsa, genel tür ek açıklamalarını her yere serpmek zorundaydınız.
Bu iki bildirimi karşılaştırın:
Map<Foo, Comparable<? extends Bar>> fooBarMap = new HashMap<Foo, Comparable<? extends Bar>>();
karşı:
Map<Foo, Comparable<? extends Bar>> fooBarMap = Collections.emptyMap();
İkincisi, okunabilirliği açıkça iki önemli yolla kazanır:
- İlk deklarasyonda, boş bir haritanın tüm somutlaştırılması jenerik tip beyanların gürültüsüne gömülür ve bu da önemsiz bir beyanı olması gerekenden çok daha şifreli hale getirir.
- Sağ tarafta jenerik tip ek açıklama eksikliğine ek olarak, ikinci versiyon haritanın boş bir haritaya başlatıldığını açıkça belirtmektedir. Buna ek olarak - bu yöntemin değişmez bir harita döndürdüğünü bilerek, sadece arayarak
fooBarMapbaşka bir boş olmayan değer atandığı yeri bulmak artık daha kolay /fooBarMap =/.