ProgramlamaAndroid geliştirici

Kotlin'deki güvenli çağrı operatörü ('?.') nasıl çalışır ve nullable türlerle çalışmak için ne zaman uygulanmalıdır?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Açık kontrollerden kaçınmayı sağlar if (object != null) { ... }
  • İç içe kontrollerin kısa ve kullanışlı bir alternatifi olarak işlev görür
  • null durumunu işlemek için let ve Elvis operatörü ile birlikte kullanılabilir

Sorular

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

Tipik hatalar ve anti-paternler

  • '?.' sonrası '!!' kullanmak — güvenli çağrının anlamı kaybolur, NullPointerException'a yol açabilir.
  • null durumunu çıkışta işlemeksizin uzun '?.' zincirleri oluşturmak — sonuç, ek bir kontrol olmadan daha fazla çalışma için rahatsız edici olabilir.

Gerçek hayattan bir örnek

Negatif durum

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ı:

  • Kısa ve özdür.

Eksileri:

  • Zincirde herhangi bir null varsa uygulama NullPointerException ile çökecektir.

Pozitif durum

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ı:

  • Hatalardan koruma, öngörülebilir davranış, okunabilirlik.

Eksileri:

  • Zincirde null'ın ne zaman ortaya çıktığını ek günlüğe kaydetmeden teşhis etmek zor olabilir.