Сначала выводится companion, затем init-1, init-2, secondary: 1, search. Для второго объекта повторяются init-1, init-2, secondary: 2, search, но не companion.
Каков порядок init и companion object в Kotlin?
Сначала выводится companion, затем init-1, init-2, secondary: 1, search. Для второго объекта повторяются init-1, init-2, secondary: 2, search, но не companion.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В Kotlin/JVM выполните main и определите порядок строк:
class Habr() {
companion object { init { println("companion") } }
init { println("init-1") }
init { println("init-2") }
constructor(n: Int) : this() { println("secondary: $n") }
fun searchMagnit() { println("search") }
}
fun main() {
Habr(1).searchMagnit()
Habr(2).searchMagnit()
}
Ответ
Сначала выводится companion, затем init-1, init-2, secondary: 1, search. Для второго объекта повторяются init-1, init-2, secondary: 2, search, но не companion.
Companion относится к классу и инициализируется один раз. Каждый вторичный конструктор делегирует первичному: сначала выполняются init-блоки экземпляра в порядке объявления, затем тело вторичного конструктора. Метод searchMagnit вызывается только после успешного завершения создания соответствующего объекта. Порядок в этой задаче не связан с асинхронностью: main выполняет вызовы последовательно.
Источник: kotlinlang.org.