val/var, null safety və tip sistemi
Kotlin-in tip sistemi nullable və non-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ı:
val— read-only istinad: bir dəfə mənimsədilir, yenidən mənimsədilə bilməz. Immutable obyekt demək deyil —val 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.
| Operator | Nə edir | Nə vaxt işlət |
|---|---|---|
| `?.` (safe call) | Null olduqda zəncirin nəticəsi null olur | Defolt seçim — null mümkün olan hər yerdə |
| `?:` (Elvis) | Null olduqda ehtiyat dəyər verir | Defolt dəyər və ya erkən return üçün |
| `!!` (not-null assertion) | Null olduqda NPE atır | Demək olar heç vaxt — code smell sayılır |
| `lateinit var` | Sonradan mənimsədiləcək non-null var | DI/lifecycle ilə gec initialize olunan sahələr |
| `by lazy { }` | İlk müraciətdə hesablanan val | Bahalı, 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 varelan et, initialize etmədən oxu — hansı exception gəldiyini gör, sonra::field.isInitializedilə 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
- Null safety — Kotlin sənədlərirəsmikotlinlang.org
- Properties (val/var, lateinit, lazy)rəsmikotlinlang.org
- Kotlin Playgroundrəsmiplay.kotlinlang.org
Nümunələri brauzerdə işə salıb yoxla.