Kotlin Academy · Lektion

lateinit og lazy-initialisering

Brug lateinit til egenskaber, der tildeles senere, og by lazy til udskudt beregning.

Lektion 4 af 413 trin

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.

Gratis at komme i gang

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

  1. Primær konstruktør og egenskabsparametre
  2. init-blokke og initialiseringsrækkefølge
  3. Tilpassede getters og setters med field
  4. lateinit og lazy-initialisering
← Tilbage til Kotlin Academy