Lateinit ve lazy
- Kotlin kursu
- Orta seviye
- Ders 4/116
- 5 dk
lateinit ve by lazy ile gecikmiş başlatma öğrenirsin.
lateinit
lateinit, yalnızca var ve non-null referans türleri için kullanılır. Özelliği şimdi değil, daha sonra başlatacağını söyler. Bu, bağımlılıkların kurulum aşamasında atandığı durumlar için uygundur.
Örnek: lateinit var service: UserService. Burada service tanımda başlatılmaz; sonradan service = RealService() ile atanır. Başlatılmadan önce okunursa Kotlin bir UninitializedPropertyAccessException fırlatır. İlkel türler ve val özelliklerde kullanılamaz.
by lazy
by lazy, bir val özelliğin değerini ilk erişimde hesaplar ve önbelleğe alır. Bu gecikmiş başlatma (lazy initialization) için standart yoldur; hesaplama yalnızca bir kez yapılır.
Örnek: val config: String by lazy { loadConfig() }. config ilk okunduğunda loadConfig() çağrılır ve sonuç saklanır. Sonraki erişimlerde aynı değer döner. Bu, pahalı işlemleri yalnızca gerektiğinde çalıştırmak için kullanılır. Varsayılan olarak thread-safe'tir.
Uygulama Config sınıfını tanımla
Config adında bir sınıf tanımla. İçinde lateinit var apiKey: String özelliğini ekle. val cachedConfig: String by lazy { "ayarlar yüklendi" } özelliğini ekle. main içinde bir Config örneği oluştur, apiKey'ye "secret123" ata ve her iki özelliği de println ile yazdır.
Başlangıç kodu
// Config sınıfı tanımı
// lateinit ile apiKey özelliği
// by lazy ile cachedConfig özelliği
// main içinde örnekle, apiKey ata, ikisini yazdırÖrnek çözüm
class Config {
lateinit var apiKey: String
val cachedConfig: String by lazy {
"ayarlar yüklendi"
}
}
fun main() {
val c = Config()
c.apiKey = "secret123"
println(c.apiKey)
println(c.cachedConfig)
}Beklenen çıktı
secret123 ayarlar yüklendi
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 lateinit tanımını tamamla
class App {
____ var service: UserService
}
class App {
lateinit var service: UserService
}
Açıklama: lateinit var, sonradan başlatılacak özelliği tanımlar.
2 lateinit ve lazy kavramlarını eşle
| Kavram | Anlamı |
|---|---|
lateinit var |
Sonradan atanan var |
by lazy |
İlk erişimde hesaplanan val |
val by lazy |
Read-only gecikmiş özellik |
UninitializedPropertyAccessException |
Erken erişim hatası |
3 Hangisi by lazy için geçerli bir tanımdır?
- val config: String by lazy { load() } Doğru cevap
- var config by lazy { load() }
- lateinit val config: String
- val config = lazy
Açıklama: by lazy val ile read-only özellik için kullanılır.