lateinit ve Tembel Başlatma
Sonradan atanacak özellikler için lateinit, ertelenmiş hesaplama için by lazy kullanın.
lateinit ve Tembel Başlatma, CoddyKit'te ücretsiz bir Kotlin Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Kotlin Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Kotlin Academy kursu toplamda 4 dersten oluşur.
Geç Kurulum İçin İki Araç
Bazen bir özelliği oluşturma zamanında başlatamazsınız. Kotlin, lateinit (sonradan atanan var için) ve by lazy (ilk erişimde hesaplanan val için) olanağını sunar.
lateinit Temelleri
lateinit var başlatmayı erteler. Değişken, null olmayan ve ilkel türde olmayan bir var olmalıdır. Atama yapılmadan önce erişilirse UninitializedPropertyAccessException fırlatılır.
class Service {
lateinit var name: String
fun init(value: String) { name = value }
}
fun main() {
val s = Service()
s.init("MyService")
println(s.name)
}lateinit Neden Kullanılır?
lateinit'i bağımlılık ekleme, test düzenekleri veya başlatmanın oluşturucunun dışında gerçekleştiği çerçeve tarafından yönetilen yaşam döngüleri (Android görünümleri, Spring bean'leri) için kullanın.
class Repository {
lateinit var db: String // assigned later by DI framework
fun query() = "querying $db"
}
fun main() {
val r = Repository()
r.db = "postgres://localhost"
println(r.query())
}isInitialized Denetimi
Bir lateinit özelliğine atama yapılıp yapılmadığını ::propName.isInitialized kullanarak denetleyebilirsiniz.
class Foo {
lateinit var bar: String
fun status() = if (::bar.isInitialized) "set to $bar" else "unset"
}
fun main() {
val f = Foo()
println(f.status()) // unset
f.bar = "hi"
println(f.status())
}lateinit Kısıtlamaları
lateinit'i ilkel türlerde (Int, Boolean vb.), nullable türlerde veya val üzerinde kullanamazsınız. Derleyici bu kuralları zorunlu kılar.
// VALID:
lateinit var name: String
// INVALID:
// lateinit var count: Int // primitives not allowed
// lateinit val constant: String // val not allowed
// lateinit var maybe: String? // nullable not allowed
fun main() { name = "ok"; println(name) }by lazy Temelleri
by lazy, bir val değerinin başlatılmasını ilk erişime kadar erteler. Lambda bir kez çalışır ve sonuç önbelleğe alınır.
val expensive: String by lazy {
println("Computing...")
"result"
}
fun main() {
println(expensive) // Computing... then result
println(expensive) // result (cached)
}by lazy Neden Kullanılır?
by lazy'yi başlatma işlemi maliyetliyse ve gerekli olmayabilirse (daha sonra kullanmak üzere önbelleğe almak için) veya başlatma işlemi önceden oluşturulmuş diğer özelliklere bağlıysa kullanın.
class Config {
val parsed: Map<String, String> by lazy {
println("parsing config...")
mapOf("host" to "localhost", "port" to "8080")
}
}
fun main() {
val c = Config()
println("config object created — not parsed yet")
println(c.parsed["host"]) // now parses
println(c.parsed["port"]) // cached
}lazy İş Parçacığı Güvenliği Modları
Varsayılan olarak by lazy, LazyThreadSafetyMode.SYNCHRONIZED kullanır. Eşzamanlı başlatmanın uygun olduğu durumlarda PUBLICATION, tek iş parçacıklı performans için NONE kullanın.
val safe: String by lazy { "thread-safe" }
val fast: String by lazy(LazyThreadSafetyMode.NONE) { "fast, single-thread" }
fun main() {
println(safe)
println(fast)
}lateinit ve lazy Karşılaştırması
var, dışarıdan atanır. by lazy: val, ilk erişimde özelliğin kendisi tarafından hesaplanır.class Demo {
lateinit var injected: String // assigned by caller
val computed: String by lazy { "computed once" }
}
fun main() {
val d = Demo()
d.injected = "from outside"
println(d.injected)
println(d.computed)
}lazy ile Diğer Özellikleri Okuma
Lazy bir özellik, daha önce başlatılmış diğer özellikleri okuyabilir ve bunları birleştirebilir.
class User(val first: String, val last: String) {
val fullName: String by lazy { "$first $last" }
}
fun main() {
val u = User("Ada", "Lovelace")
println(u.fullName)
}Uygulamalı Örüntü
Aynı sınıfta DI için lateinit'i, türetilmiş durum için by lazy'yi birleştirin.
class App {
lateinit var config: Map<String, String>
val host: String by lazy { config["host"] ?: "localhost" }
}
fun main() {
val app = App()
app.config = mapOf("host" to "api.example.com")
println(app.host) // api.example.com
}Hızlı Kontrol
Bir val özelliğinin başlatılmasını ilk erişime kadar hangi anahtar sözcük erteler?
Özet
Çerçeveler veya DI tarafından sonradan atanan null olmayan değiştirilebilir özellikler için lateinit var kullanın. İlk erişimde bir kez hesaplanması gereken salt okunur değerler için val by lazy kullanın. Durumu ::prop.isInitialized ile denetleyin.
Sıkça Sorulan Sorular
“lateinit ve Tembel Başlatma” dersi ücretsiz mi?
Evet — “lateinit ve Tembel Başlatma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Kotlin Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Kotlin Academy kursu toplamda 4 dersten oluşur.
“lateinit ve Tembel Başlatma” dersinde ne öğreneceğim?
Sonradan atanacak özellikler için lateinit, ertelenmiş hesaplama için by lazy kullanın. Kotlin Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Kotlin Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Kotlin Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“lateinit ve Tembel Başlatma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Kotlin Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Kotlin Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Birincil Yapıcı ve Özellik Parametreleri
- init Blokları ve Başlatma Sırası
- field ile Özel Get ve Set İşlevleri
- lateinit ve Tembel Başlatma