Java ekibi, Java 8'deki işlevsel programlamanın önündeki engelleri kaldırarak bir sürü harika çalışma yaptı. Özellikle, java.util Collections'taki değişiklikler, çok hızlı akış işlemlerine dönüştürülmesi için büyük bir zincirleme işi yapıyor. Koleksiyonlara birinci sınıf işlevler ve fonksiyonel yöntemler ekleyerek ne kadar iyi yaptıklarını göz önünde bulundurarak, neden değişmez koleksiyonlar ve hatta değişmez koleksiyon arayüzleri sağlayamıyorlar?
Var olan herhangi bir kodu değiştirmeden, Java ekibi herhangi bir zamanda değiştirilebilir olanlarla aynı olan değişken arayüzleri ekleyebilir, "set" yöntemlerini eksi ekleyebilir ve mevcut arayüzlerin bunlardan genişlemesini sağlayabilir:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
Tabii, List.add () ve Map.put () gibi işlemler, işlemin başarılı veya başarısız olduğunu belirtmek için şu anda verilen anahtar için bir boolean veya önceki değer döndürüyor. Değiştirilemez koleksiyonların fabrikalar gibi yöntemleri ele alması ve mevcut imzayla uyumlu olmayan eklenen öğeyi içeren yeni bir toplama yapması gerekir. Ancak bu, ImmutableList.append () veya .addAt () ve ImmutableMap.putEntry () gibi farklı bir yöntem adı kullanarak çözülebilir. Sonuçta ortaya çıkan ayrıntılılık, değişmeyen koleksiyonlarla çalışmanın yararlarından daha ağır basacak ve tip sistemi yanlış yöntemi arama hatalarını önleyecektir. Zamanla, eski yöntemler kullanımdan kaldırılabilir.
Değişmez koleksiyonların kazancı:
- Basitlik - temel verinin değişmediği durumlarda kod hakkında muhakeme daha basittir.
- Belgeleme - Bir yöntem değişmez bir koleksiyon arayüzüne sahipse, bu koleksiyonu değiştirmeyeceğini bilirsiniz. Bir yöntem değişmez bir koleksiyon döndürürse, onu değiştiremeyeceğinizi bilirsiniz.
- Eşzamanlılık - değişmeyen koleksiyonlar iş parçacıkları arasında güvenle paylaşılabilir.
Değişmezliği kabul eden dilleri tadayan biri olarak, yaygın mutasyona uğramış vahşi batıya dönmek çok zordur. Clojure'un koleksiyonları (dizi soyutlaması) zaten Java 8 koleksiyonlarının sağladığı her şeye, artı değişkenliğe (akışlar yerine senkronize bağlı listeler nedeniyle ek bellek ve zaman kullanıyor olsa da) zaten sahip. Scala, tam bir işlem setiyle hem değişken hem de değişmeyen koleksiyonlara sahiptir ve bu işlemler istekli olsa da, .iterator'ı tembel bir görünüm verir (ve bunları tembel olarak değerlendirmenin başka yolları da vardır). Java'nın, değişmeyen koleksiyonlar olmadan nasıl rekabet etmeye devam edebileceğini anlamıyorum.
Birisi beni bu konuda tarih veya tartışmalara yönlendirebilir mi? Kesinlikle bir yerlerde halka açık.
const
koleksiyonların olduğu gibi, onu değiştirebilirsin
Collections.unmodifiable*()
için olduğunu ve bunun için var. ama bunları olmadıklarında değişmez olarak kabul etmeyin
ImmutableList
bu şemaya girerse , insanlar değişkene geçebilir List
mi? Hayır, bu LSP'nin çok kötü bir ihlalidir.