Sparround

val/var, null safety və tip sistemi

Kotlin-in tip sistemi nullablenon-nullable tipləri ayırır: String heç vaxt null ola bilməz, String? isə ola bilər. Bu, Java-dakı NullPointerException-ların böyük hissəsini compile vaxtı tutur.

Dəyişən elanı:

  • valread-only istinad: bir dəfə mənimsədilir, yenidən mənimsədilə bilməz. Immutable obyekt demək deyilval list = mutableListOf(1) siyahının özünü dəyişməyə imkan verir.
  • var — dəyişdirilə bilən istinad.

Müsahibədə tez-tez soruşulur: "val immutable deməkdirmi?" Düzgün cavab: val istinadın dəyişməzliyidir, obyektin yox.

OperatorNə edirNə vaxt işlət
`?.` (safe call)Null olduqda zəncirin nəticəsi null olurDefolt seçim — null mümkün olan hər yerdə
`?:` (Elvis)Null olduqda ehtiyat dəyər verirDefolt dəyər və ya erkən return üçün
`!!` (not-null assertion)Null olduqda NPE atırDemək olar heç vaxt — code smell sayılır
`lateinit var`Sonradan mənimsədiləcək non-null varDI/lifecycle ilə gec initialize olunan sahələr
`by lazy { }`İlk müraciətdə hesablanan valBahalı, bir dəfə lazım olan dəyərlər

Müsahibə tələsi: lateinit yalnız var və reference tiplər üçündür, lazy isə yalnız val üçün. lateinit initialize olunmayıbsa UninitializedPropertyAccessException atır — bunu ::field.isInitialized ilə yoxlamaq olar. Bank layihələrində !! adətən code review-da bloklanır.

🛠 Tapşırıq

Kotlin Playground-da kiçik bir Account modeli yaz: val sahələr, biri nullable (primaryCard: Card?).

  • !! ilə bir sətir yaz və null dəyərlə qəsdən crash etdir — stack trace-i oxu.
  • Həmin sətri ?. + ?: ilə yenidən yaz.
  • lateinit var elan et, initialize etmədən oxu — hansı exception gəldiyini gör, sonra ::field.isInitialized ilə qoru.

Bitdi sayılır: üç variantın da nəticəsini bir cümlə ilə izah edə bilirsənsə.

📚 Mənbələr və sənədlər