Kotlin, iki tür koleksiyon sunar: değişmez (immutable) ve değiştirilebilir (mutable).
List — değişmez liste. Eleman ekleyemez veya çıkaramazsınız.MutableList — değiştirilebilir liste: eleman ekleyebilir ve çıkarabilirsiniz.Set — değişmez küme (eşsiz elemanlar).MutableSet — değiştirilebilir küme.Map — anahtar-değer eşleşmesi, değişmez.MutableMap — değiştirilebilir anahtar-değer eşleşmesi.val fruits: List<String> = listOf("Apple", "Banana", "Cherry") val mutableFruits: MutableList<String> = mutableListOf("Apple", "Banana") mutableFruits.add("Cherry") val fruitSet: Set<String> = setOf("Apple", "Banana") // Elemanların eşsizlik durumu val mutableFruitSet: MutableSet<String> = mutableSetOf("Apple", "Banana") mutableFruitSet.add("Cherry") val scores: Map<String, Int> = mapOf("Tom" to 80, "Jane" to 90) val mutableScores: MutableMap<String, Int> = mutableMapOf("Tom" to 80) mutableScores["Jane"] = 90
İnce noktalar:
List (değiştirilebilir liste değil) döner.Eğer bir fonksiyon,
List<T>parametresi alıyorsa, bu listeyi fonksiyon içinde herhangi bir şekilde değiştirebilir misiniz?
Cevap: Hayır, eğer parametre tipi List<T> ise, fonksiyon içinde eleman ekleyemez veya çıkaramazsınız. Ancak pratikte MutableList<T> geçtiyse, bu tür dönüştürme yapabiliriz (bu bir risk taşır):
fun modifyList(list: List<String>) { if (list is MutableList) { list.add("Another") // Eğer orijinal koleksiyon değiştirilebilen ise çalışır } }
Bunun yapılması önerilmez, çünkü sözleşmeyi ihlal eder (List değişmez olmalıdır!).
Hikaye
Büyük bir projede,
List<Customer>alan bir fonksiyon kullandık ve bu listeye yeni bir eleman eklemeye çalıştık. Derleme hatası (add/clear/remove List için tanımlı değil) yalnızca gözden geçirme sırasında görüldü, çünkü verileri dönüştürmek için gerçekten değiştirilebilir bir liste gerekiyordu.
Hikaye
Koleksiyon
MutableListolarak ilan edildi, ama senkronizasyon olmadan birkaç iş parçacığına geçirildi. Sonuç olarak, rekabet eden değişiklikler oldu ve "ConcurrentModificationException" ile listenin durumu bozuldu. Hata uzun süre arandı, thread-safety dikkate alınmadı.
Hikaye
Veritabanı sorgu sonuçlarıyla çalışmak için bir serviste
mutableListOfkullandık ve sonra dışarıya referans verdik. Dış kod yanlışlıkla listeyi temizledi. Sonuç olarak kullanıcıya boş veriler geliyordu, çünkü referanslar kopyalanmadı ve değiştirilebilir koleksiyonlar iş mantığı katmanının dışında değiştirildi.