CodeBlanks Logo Icon CodeBlanks

Lateinit ve lazy

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

Main.kt
// 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

Main.kt
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

Soru
class App {
    ____ var service: UserService
}
Cevap
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.

Orta seviye bölümündeki tüm dersler