Sobes.tech
Junior — Middle

В какъв ред се случва инициализацията на свойствата и изпълнението на блоковете код при създаването на обект, включително companion object, init блок, променливите в конструктора и обикновените променливи?

sobes.tech AI

Отговор от AI

Когато създавате обект в Kotlin, редът на инициализация е следният:

  1. Инициализация на companion object — случва се веднъж при зареждане на класа, преди създаването на екземпляри.
  2. Инициализация на свойствата, обявени в тялото на класа (включително тези, обявени извън конструктора) — те се инициализират в реда на тяхното обявяване.
  3. Изпълнение на init блоковете — те се изпълняват в реда, в който са обявени в класа, непосредствено след инициализацията на свойствата.
  4. Инициализация на свойствата, обявени в конструктора (например, параметри с val/var) — те се инициализират при извикване на конструктора.

Пример:

class Example(val constructorProp: String) {
    val property1 = println("property1 инициализиран")

    init {
        println("init блок 1")
    }

    val property2 = println("property2 инициализиран")

    init {
        println("init блок 2")
    }

    companion object {
        init {
            println("companion object инициализиран")
        }
    }
}

fun main() {
    val example = Example("конструктор")
}

Изходът ще бъде приблизително:

companion object инициализиран
property1 инициализиран
init блок 1
property2 инициализиран
init блок 2

По този начин, companion object се инициализира веднъж при зареждане на класа, след това при създаване на обект се инициализират свойствата и се изпълняват init блоковете в реда на обявяване, а параметрите на конструктора се инициализират при извикване на конструктора.