0Pricing
Kotlin Academy · Урок

Блоки 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 — локальная установка не требуется.

Все уроки этого курса

  1. Первичный конструктор и параметры-свойства
  2. Блоки init и порядок инициализации
  3. Пользовательские геттеры и сеттеры с field
  4. lateinit и отложенная инициализация
← Назад к Kotlin Academy