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
- Konstruktor główny i parametry właściwości
- Bloki init i kolejność inicjalizacji
- Własne gettery i settery z field
- lateinit i leniwa inicjalizacja