Güvenli çağrı operatörü '?.', Kotlin'de null değerlerle başa çıkmada temel araçlardan biridir ve potansiyel olarak eksik değerlerle çalışmanın güvenliğini ve kolaylığını artırmaya yönelik bir dilin geliştirilmesinin bir sonucudur.
Konu Tarihi: Java'da null değerler genellikle hataların kaynağıdır (NullPointerException). Kotlin, nullable ve not-nullable değişkenlerin açık bir ayrımını içeren katı bir tür sistemi getirmiştir ve bunları kullanmak için kullanışlı araçlar sunmuştur.
Sorun: null olabilecek nesnelerle çalışırken NullPointerException'dan nasıl kaçınılabilir, okuma kolaylığını ve kodun kısalığını feda etmeden?
Çözüm: '?.' operatörü, nullable değişkenlerin özelliklerine ve yöntemlerine nazikçe erişim sağlar: nesne null değilse çağrı yapılır, eğer null ise, null döner (veya gerekli mantık devam eder).
Kod örneği:
val user: User? = getUser() val name = user?.name // eğer user != null ise, user.name döner, aksi takdirde null user?.printInfo() // eğer user != null ise, printInfo() çağrılır
Anahtar özellikler:
Güvenli çağrı operatörü '?.' atamaların sol tarafında kullanılabilir mi?
Hayır. '?.' operatörü, bir özelliğin veya değişkenin değerini güvenli bir şekilde ayarlamak için kullanılamaz; yalnızca erişim veya çağrı için geçerlidir. Aşağıdaki yanlıştır:
user?.name = "Alex" // Derleme hatası
Özelliklerin ataması, açık bir kontrol ile güvenli bir şekilde gerçekleştirilebilir:
user?.let { it.name = "Alex" }
Güvenli çağrı operatörlerinin zinciri null ile karşılaştığında ne döner?
Bir zincir '?.' elemanlarından biri null olduğunda, ifadenin sonucu null olur, sonraki güvenli çağrılar gerçekleştirilmez.
Örnek:
user?.address?.zipCode // eğer user veya address == null ise, sonuç null
Güvenli çağrı '?.' Unit döndüren fonksiyonlarla kullanılabilir mi?
Evet, çağrı yine de yalnızca nesne null değilse gerçekleşir, ve nesne null ise Unit yerine null döner.
Örnek:
user?.clearData() // eğer user == null ise, hiçbir şey olmaz
Geliştirici, nesnenin null olabileceği yerlerde '!!' kullanır, uzun bir güvenli çağrı zincirinden sonra:
val country = user?.address?.city?.country!!
Artıları:
Eksileri:
Güvenli çağrı, varsayılan değeri döndürmek için Elvis operatörü ile birlikte kullanılır:
val country = user?.address?.city?.country ?: "Bilinmiyor"
Artıları:
Eksileri: