lateinit en lazy initialisatie
Gebruik lateinit voor properties die later worden toegewezen en by lazy voor uitgestelde berekeningen.
lateinit en lazy initialisatie is een gratis Kotlin Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Kotlin Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Kotlin Academy bevat in totaal 4 lessen.
Twee hulpmiddelen voor late initialisatie
Soms kun je een eigenschap niet tijdens het maken van een instantie initialiseren. Kotlin biedt lateinit (voor een var die later wordt toegewezen) en by lazy (voor een val die bij de eerste toegang wordt berekend).
De basis van lateinit
lateinit var stelt de initialisatie uit. De variabele moet een niet-null, niet-primitieve var zijn. Toegang vóór de toewijzing leidt tot UninitializedPropertyAccessException.
class Service {
lateinit var name: String
fun init(value: String) { name = value }
}
fun main() {
val s = Service()
s.init("MyService")
println(s.name)
}Waarom lateinit gebruiken?
Gebruik lateinit voor afhankelijkheidsinjectie, testgegevens of door frameworks beheerde levenscycli (Android-weergaven, Spring-beans) wanneer de initialisatie buiten de constructor plaatsvindt.
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())
}Controle met isInitialized
Je kunt controleren of aan een lateinit-eigenschap een waarde is toegewezen met ::propName.isInitialized.
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())
}Beperkingen van lateinit
Je kunt lateinit niet gebruiken voor primitieve typen (Int, Boolean enzovoort), typen die null mogen zijn of val. De compiler dwingt deze regels af.
// 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) }De basis van by lazy
by lazy stelt de initialisatie van een val uit tot de eerste toegang. De lambda wordt één keer uitgevoerd en het resultaat wordt opgeslagen.
val expensive: String by lazy {
println("Computing...")
"result"
}
fun main() {
println(expensive) // Computing... then result
println(expensive) // result (cached)
}Waarom by lazy gebruiken?
Gebruik by lazy wanneer initialisatie duur is en mogelijk niet nodig is (sla de waarde op voor later gebruik), of wanneer de initialisatie afhankelijk is van andere eigenschappen die al zijn gemaakt.
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
}Threadveiligheidsmodi van lazy
Standaard gebruikt by lazy LazyThreadSafetyMode.SYNCHRONIZED. Gebruik PUBLICATION voor initialisatie die gelijktijdig mag plaatsvinden en NONE voor prestaties in één thread.
val safe: String by lazy { "thread-safe" }
val fast: String by lazy(LazyThreadSafetyMode.NONE) { "fast, single-thread" }
fun main() {
println(safe)
println(fast)
}lateinit versus lazy
lateinit: var, extern toegewezen. by lazy: val, bij de eerste toegang door de eigenschap zelf berekend.
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)
}Andere eigenschappen lezen met lazy
Een lazy-eigenschap kan andere eigenschappen lezen die eerder zijn geïnitialiseerd en ze combineren.
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)
}Praktisch patroon
Combineer lateinit voor afhankelijkheidsinjectie met by lazy voor afgeleide status in dezelfde klasse.
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
}Korte controle
Welk sleutelwoord stelt de initialisatie van een val-eigenschap uit tot de eerste toegang?
Samenvatting
Gebruik lateinit var voor niet-null, veranderlijke eigenschappen die later door frameworks of afhankelijkheidsinjectie worden toegewezen. Gebruik val by lazy voor alleen-lezenwaarden die bij de eerste toegang één keer moeten worden berekend. Controleer de status met ::prop.isInitialized.
Leer Kotlin met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 51
- Lessen
- 203
Veelgestelde vragen
Is de les “lateinit en lazy initialisatie” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Kotlin Academy, waaronder “lateinit en lazy initialisatie”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Kotlin Academy bevat in totaal 4 lessen.
Wat leer ik in “lateinit en lazy initialisatie”?
Gebruik lateinit voor properties die later worden toegewezen en by lazy voor uitgestelde berekeningen. Je oefent met Kotlin Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Kotlin Academy te beginnen?
Ervaring vooraf is niet nodig. Kotlin Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.
Hoe lang duurt de les “lateinit en lazy initialisatie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Kotlin Academy?
Ja. Elke les over Kotlin Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Primaire constructor en propertyparameters
- init-blokken en initialisatievolgorde
- Aangepaste getters en setters met field
- lateinit en lazy initialisatie