0Pricing
Kotlin Academy · Lekcja

Bloki init i kolejność inicjalizacji

Używaj bloków init i poznaj kolejność inicjalizacji właściwości oraz bloków.

Bloki init i kolejność inicjalizacji to bezpłatna lekcja Kotlin Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Kotlin Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Czym jest blok init?

Blok init { } zawiera kod wykonywany podczas tworzenia instancji. Jest częścią logiki konstruktora podstawowego.

Prosty blok init

Blok init jest wykonywany podczas tworzenia obiektu, po inicjalizatorach właściwości, w kolejności występowania w kodzie źródłowym.

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

Walidacja w init

Używaj require / check wewnątrz init, aby wymuszać niezmienniki podczas tworzenia obiektu.

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
}

Wiele bloków init

Można mieć kilka bloków init; są one wykonywane w kolejności występowania w kodzie źródłowym, naprzemiennie z inicjalizatorami właściwości.

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)
}

Kolejność inicjalizatorów właściwości i init

Inicjalizatory właściwości i bloki init są wykonywane od góry do dołu, w kolejności występowania w kodzie źródłowym. Właściwość musi zostać przypisana przed użyciem.

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

Nie można używać właściwości przed ich inicjalizacją

Odwołanie do właściwości przed wykonaniem jej inicjalizatora jest błędem kompilacji.

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

Obliczanie właściwości pochodnych

Używaj bloków init do obliczania stanu pochodnego zależnego od wielu parametrów konstruktora.

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
}

Efekty uboczne: rejestrowanie

Używaj init do nietrywialnych czynności konfiguracyjnych, takich jak rejestrowanie, alokowanie zasobów lub rejestracja.

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

Kolejność init w podklasach

Init nadklasy jest wykonywany przed init podklasy. Właściwości każdej klasy są inicjalizowane w kolejności występowania w kodzie źródłowym.

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

Unikaj złożonej logiki w init

Długotrwałe bloki init spowalniają każde tworzenie obiektu. Jeśli konfiguracja jest kosztowna, rozważ leniwą inicjalizację lub metody fabrykujące.

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
}

Łączenie init z konstruktorami dodatkowymi

Konstruktory dodatkowe delegują do konstruktora podstawowego, a bloki init są wykonywane jako część ścieżki konstruktora podstawowego.

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

Szybkie sprawdzenie

Jaka jest kolejność wykonywania wielu bloków init i inicjalizatorów właściwości w klasie Kotlina?

Podsumowanie

Bloki init zawierają logikę wykonywaną podczas tworzenia obiektu — walidację, obliczanie właściwości pochodnych i efekty uboczne. Wiele bloków jest wykonywanych w kolejności występowania w kodzie źródłowym, naprzemiennie z inicjalizatorami właściwości. Unikaj złożonych operacji w init; zamiast tego używaj lazy lub metod fabrykujących.

Często zadawane pytania

Czy lekcja „Bloki init i kolejność inicjalizacji” jest bezpłatna?

Tak — pełny tekst „Bloki init i kolejność inicjalizacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Kotlin Academy, przejdź na CoddyKit PRO. Kurs Kotlin Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Bloki init i kolejność inicjalizacji”?

Używaj bloków init i poznaj kolejność inicjalizacji właściwości oraz bloków. Ćwiczysz Kotlin Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Kotlin Academy?

Nie wymagamy żadnego doświadczenia. Kotlin Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Bloki init i kolejność inicjalizacji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Kotlin Academy?

Tak. Każda lekcja Kotlin Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Konstruktor główny i parametry właściwości
  2. Bloki init i kolejność inicjalizacji
  3. Własne gettery i settery z field
  4. lateinit i leniwa inicjalizacja
← Powrót do Kotlin Academy