lateinit og lazy-initialisering
Brug lateinit til egenskaber, der tildeles senere, og by lazy til udskudt beregning.
lateinit og lazy-initialisering er en gratis Kotlin Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Kotlin Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Kotlin Academy-kurset indeholder 4 lektioner i alt.
To værktøjer til sen initialisering
Nogle gange kan du ikke initialisere en egenskab på konstruktionstidspunktet. Kotlin giver dig lateinit (til var, der tildeles senere) og by lazy (til val, der beregnes ved første adgang).
Grundlæggende om lateinit
lateinit var udskyder initialiseringen. Variablen skal være en ikke-nullbar, ikke-primitiv var. Adgang før tildeling udløser UninitializedPropertyAccessException.
class Service {
lateinit var name: String
fun init(value: String) { name = value }
}
fun main() {
val s = Service()
s.init("MyService")
println(s.name)
}Hvorfor bruge lateinit?
Brug lateinit til afhængighedsinjektion, testdata eller frameworkstyrede livscyklusser (Android-visninger, Spring-beans), hvor initialiseringen sker uden for konstruktøren.
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())
}Tjek med isInitialized
Du kan tjekke, om en lateinit-egenskab er blevet tildelt, ved hjælp af ::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())
}Begrænsninger for lateinit
Du kan ikke bruge lateinit på primitive typer (Int, Boolean osv.), nullbare typer eller val. Kompileren håndhæver disse regler.
// 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) }Grundlæggende om by lazy
by lazy udskyder initialiseringen af en val, indtil den tilgås første gang. Lambdaen kører én gang, og resultatet gemmes i cachen.
val expensive: String by lazy {
println("Computing...")
"result"
}
fun main() {
println(expensive) // Computing... then result
println(expensive) // result (cached)
}Hvorfor bruge by lazy?
Brug by lazy, når initialiseringen er dyr og måske ikke bliver nødvendig, så den kan gemmes til senere brug, eller når initialiseringen afhænger af andre egenskaber, der allerede er konstrueret.
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
}Trådsikkerhedstilstande for lazy
Som standard bruger by lazy LazyThreadSafetyMode.SYNCHRONIZED. Brug PUBLICATION til initialisering, der tåler samtidighed, og NONE for ydeevne i enkelttrådede programmer.
val safe: String by lazy { "thread-safe" }
val fast: String by lazy(LazyThreadSafetyMode.NONE) { "fast, single-thread" }
fun main() {
println(safe)
println(fast)
}lateinit kontra lazy
lateinit: var, der tildeles eksternt. by lazy: val, der beregnes af selve egenskaben ved første adgang.
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 læser andre egenskaber
En lazy-egenskab kan læse andre egenskaber, der er initialiseret tidligere, og kombinere dem.
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)
}Praktisk mønster
Kombinér lateinit til DI og by lazy til afledt tilstand i den samme 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
}Hurtigt tjek
Hvilket nøgleord udskyder initialiseringen af en val-egenskab, indtil den tilgås første gang?
Opsummering
Brug lateinit var til ikke-nullbare, foranderlige egenskaber, der tildeles senere af frameworks eller DI. Brug val by lazy til skrivebeskyttede værdier, der skal beregnes én gang ved første adgang. Tjek status med ::prop.isInitialized.
Lær Kotlin med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “lateinit og lazy-initialisering” gratis?
Ja — alle 3 lektioner i læringssporet Kotlin Academy, inklusive “lateinit og lazy-initialisering”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Kotlin Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “lateinit og lazy-initialisering”?
Brug lateinit til egenskaber, der tildeles senere, og by lazy til udskudt beregning. Du øver dig i Kotlin Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Kotlin Academy?
Der kræves ingen tidligere erfaring. Kotlin Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “lateinit og lazy-initialisering”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Kotlin Academy-lektion?
Ja. Alle Kotlin Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Primær konstruktør og egenskabsparametre
- init-blokke og initialiseringsrækkefølge
- Tilpassede getters og setters med field
- lateinit og lazy-initialisering