Kotlin'de değişmezlikle genellikle bir nesnenin oluşturulduktan sonra durumunun değiştirilememesi anlamına gelir. Bu, val (değiştirilemez) özelliklerin kullanılmasıyla ve iç verileri değiştiren yöntemlerin bulunmadığı, yalnızca yapıcıda başlatılan sınıfların oluşturulmasıyla sağlanır.
Kotlin, Java'dan farklı olarak, data class gibi değişmez sınıflar oluşturmak için kullanışlı bir mekanizma sağlar ve List, Set, Map gibi koleksiyonlar (varsayılan olarak değişmezdir). Ancak, Kotlin'de temel koleksiyonların yalnızca arayüz düzeyinde değişmez olduğunu, nesne koleksiyonunun iç yapısının MutableList vb. dönüşüm yoluyla değiştirilebileceğini anlamak önemlidir.
Doğru değişmezlik örneği:
// Data class ve val değişmezlik sağlar data class User(val name: String, val age: Int) val user = User(name = "Ivan", age = 30) // user.name = "Sergey" // DERLEME HATASI
Değişmezliği ihlal eden kod örneği:
class User(var name: String, var age: Int) val user = User("Ivan", 30) user.name = "Sergey" // Nesne değiştirilebilir
Nüanslar:
val alanları ile bir data class bile tam anlamıyla değişmezliği garanti etmez, eğer alanlar referans türleri ise ve iç durumu değiştiriliyorsa.val + değişmez türler (örneğin, val scores: List<Int> gibi) kullanın.Sadece val özelliklere sahip data class nesneleri tam anlamıyla değişmez midir?
Cevap: Hayır, eğer özellikler değiştirilebilir nesneler ise (örneğin, val items: MutableList<Int>), iç durum değiştirilebilir.
Örnek:
data class Group(val members: MutableList<String>) val group = Group(mutableListOf("Tom", "Jerry")) group.members.add("Spike") // iç durum değişiyor
Hikaye
Projede
valözelliği olan bir değişmezdata classkullanılıyordu. Bir geliştirici, nesnenin değiştirilemeyeceğini bekliyordu, ancak başka bir geliştirici koleksiyona yeni öğeler ekledi. Bu, verilerin tutarsızlığına ve iki niteliğin paralel olarak ortak listeyi değiştirdiği durumlarda zor tespit edilen hatalara yol açtı.
Hikaye
Değiştirilebilir bir koleksiyona sahip bir sınıf örneği uygulama katmanları arasında iletildiğinde, bir katman içeriği değiştiriyor, diğer katmanı bilgilendirmiyordu. Bu, UI'nın meydana gelen değişikliklerden haberdar olmadığı ve geçersiz başlangıç verileri ile çalıştığı durumlara yol açtı.
Hikaye
Geliştirici, Kotlin'deki
List'in her zaman değişmez olduğunu yanlışlıkla varsaydım. Aslında, arka planda Java'dan geçen bir uygulama (ArrayList) kullanılıyordu ve listenin değiştirilmesi, beklenmeyen veri kaybı ve veritabanı ile çalışma sırasında hatalara yol açtı.