Kotlin Academy · Lektion

init-block och initieringsordning

Använd init-block och förstå ordningen för initiering av egenskaper och block.

Lektion 2 av 413 steg

init-block och initieringsordning är en gratis lektion i Kotlin Academy på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Kotlin Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Vad är ett init-block?

Ett init { }-block innehåller kod som körs när en instans konstrueras. Det är en del av den primära konstruktorns logik.

Enkelt init-block

Init-blocket körs under konstruktionen, efter egenskapsinitierare i källkodens ordning.

class Logger(val name: String) {
    init {
        println("Constructed Logger("$name")")
    }
}
fun main() {
    val l = Logger("auth")
}

Validering i init

Använd require eller check i init för att upprätthålla invariants vid konstruktionstillfället.

class Percentage(val value: Int) {
    init {
        require(value in 0..100) { "value must be 0..100, was $value" }
    }
}
fun main() {
    println(Percentage(75).value)
    // Percentage(150) // throws IllegalArgumentException
}

Flera init-block

Du kan ha flera init-block. De körs i källkodens ordning, varvade med egenskapsinitierare.

class Demo(val x: Int) {
    init { println("First init, x=$x") }
    val doubled = x * 2
    init { println("Second init, doubled=$doubled") }
}
fun main() {
    Demo(5)
}

Ordning för egenskapsinitierare och init

Egenskapsinitierare och init-block körs uppifrån och ned i källkodens ordning. En egenskap måste tilldelas innan den används.

class Order {
    val createdAt = System.currentTimeMillis()
    init { println("created at $createdAt") }
    val nextId = 1
    init { println("next id = $nextId") }
}
fun main() {
    Order()
}

Egenskaper kan inte användas innan de initieras

Att referera till en egenskap innan dess initierare körs är ett kompileringsfel.

class Bad {
    init {
        // println(name) // ERROR: name not yet initialized
    }
    val name = "after init"
}
fun main() { Bad() }

Beräkna härledda egenskaper

Använd init-block för att beräkna härlett tillstånd som beror på flera konstruktorparametrar.

class Rectangle(val width: Int, val height: Int) {
    val area: Int
    init {
        area = width * height
    }
}
fun main() {
    val r = Rectangle(4, 5)
    println("area = ${r.area}") // 20
}

Bieffekter: loggning

Använd init för icke-trivial konfigurering, till exempel loggning, allokering eller registrering.

class Service(val name: String) {
    init {
        println("[BOOT] starting service '$name'")
    }
}
fun main() {
    Service("auth")
    Service("payments")
}

Initieringsordning med underklasser

Superklassens init körs före underklassens init. Varje klass initierar sina egna egenskaper i källkodens ordning.

open class Base {
    init { println("Base init") }
}
class Sub : Base() {
    init { println("Sub init") }
}
fun main() { Sub() }

Undvik tung logik i init

Långvariga init-block gör varje konstruktion långsammare. Överväg lat initiering eller factory-metoder om konfigureringen är kostsam.

class Heavy(val n: Int) {
    val data: List<Int> by lazy { (1..n).toList() }
}
fun main() {
    val h = Heavy(1_000_000)
    println("Created without computing data")
    println("First element: ${h.data[0]}") // now data initializes
}

Kombinera init med sekundära konstruktorer

Sekundära konstruktorer delegerar till den primära konstruktorn, och init-block körs som en del av den primära vägen.

class Box(val content: String) {
    init { println("init for '$content'") }
    constructor(): this("empty") { println("secondary done") }
}
fun main() {
    Box()
}

Snabbkontroll

I vilken ordning körs flera init-block och egenskapsinitierare i en Kotlin-klass?

Sammanfattning

init-block innehåller logik som körs under konstruktionen – validering, härledda egenskaper och bieffekter. Flera block körs i källkodens ordning, varvade med egenskapsinitierare. Undvik tungt arbete i init; använd lazy eller factory-metoder i stället.

Gratis att börja

Lär dig Kotlin med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
51
Lektioner
203

Vanliga frågor

Är lektionen ”init-block och initieringsordning” gratis?

Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Kotlin Academy, inklusive ”init-block och initieringsordning”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Kotlin Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”init-block och initieringsordning”?

Använd init-block och förstå ordningen för initiering av egenskaper och block. Ni övar på Kotlin Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Kotlin Academy?

Du behöver inga förkunskaper. Utbildningen i Kotlin Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.

Hur lång tid tar lektionen ”init-block och initieringsordning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Kotlin Academy-lektionen?

Ja. Varje Kotlin Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Primärkonstruktor och egenskapsparametrar
  2. init-block och initieringsordning
  3. Egna getters och setters med field
  4. lateinit och fördröjd initiering
← Tillbaka till Kotlin Academy