Блоки init и порядок инициализации
Используйте блоки init и разбирайтесь в порядке инициализации свойств и блоков.
«Блоки init и порядок инициализации» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Что такое блок инициализации
Блок init { } содержит код, выполняющийся при создании экземпляра. Он является частью логики основного конструктора.
Простой блок инициализации
Блок init выполняется во время создания объекта после инициализаторов свойств, в порядке следования в исходном коде.
class Logger(val name: String) {
init {
println("Constructed Logger("$name")")
}
}
fun main() {
val l = Logger("auth")
}Проверка в блоке инициализации
Используйте require / check внутри init, чтобы проверять инварианты во время создания объекта.
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
}Несколько блоков инициализации
Можно использовать несколько блоков init; они выполняются в порядке следования в исходном коде, чередуясь с инициализаторами свойств.
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)
}Инициализаторы свойств и порядок блоков init
Инициализаторы свойств и блоки init выполняются сверху вниз, в порядке следования в исходном коде. Свойство должно быть присвоено до его использования.
class Order {
val createdAt = System.currentTimeMillis()
init { println("created at $createdAt") }
val nextId = 1
init { println("next id = $nextId") }
}
fun main() {
Order()
}Нельзя использовать свойства до их инициализации
Обращение к свойству до выполнения его инициализатора приводит к ошибке компиляции.
class Bad {
init {
// println(name) // ERROR: name not yet initialized
}
val name = "after init"
}
fun main() { Bad() }Вычисление производных свойств
Используйте блоки init для вычисления производимого состояния, зависящего от нескольких параметров конструктора.
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
}Побочные эффекты: ведение журнала
Используйте init для нетривиальной настройки, например ведения журнала, выделения памяти или регистрации.
class Service(val name: String) {
init {
println("[BOOT] starting service '$name'")
}
}
fun main() {
Service("auth")
Service("payments")
}Порядок инициализации в подклассах
Блок init суперкласса выполняется до блока init подкласса. Собственные свойства каждого класса инициализируются в порядке следования в исходном коде.
open class Base {
init { println("Base init") }
}
class Sub : Base() {
init { println("Sub init") }
}
fun main() { Sub() }Избегайте сложной логики в init
Долгие блоки init замедляют каждое создание объекта. Если настройка требует много ресурсов, рассмотрите ленивую инициализацию или фабричные методы.
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
}Сочетание init со вторичными конструкторами
Вторичные конструкторы делегируют вызов основному конструктору; блоки init выполняются как часть основного пути создания объекта.
class Box(val content: String) {
init { println("init for '$content'") }
constructor(): this("empty") { println("secondary done") }
}
fun main() {
Box()
}Быстрая проверка
В каком порядке выполняются несколько блоков init и инициализаторы свойств в классе Kotlin?
Повторение
Блоки init содержат логику, выполняемую во время создания объекта: проверки, вычисление производных свойств и побочные эффекты. Несколько блоков выполняются в порядке следования в исходном коде, чередуясь с инициализаторами свойств. Избегайте сложных операций в init; вместо этого используйте lazy или фабричные методы.
Часто задаваемые вопросы
Урок «Блоки init и порядок инициализации» бесплатный?
Да — полный текст урока «Блоки init и порядок инициализации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Блоки init и порядок инициализации»?
Используйте блоки init и разбирайтесь в порядке инициализации свойств и блоков. Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Блоки init и порядок инициализации»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Первичный конструктор и параметры-свойства
- Блоки init и порядок инициализации
- Пользовательские геттеры и сеттеры с field
- lateinit и отложенная инициализация