Блок инициализации (init блок)



Основной конструктор не может в себе содержать какую-либо логику по инициализации свойств (исполняемый код). Он предназначен исключительно для объявления свойств и присвоения им полученных значений. Поэтому вся логика может быть помещена в блок инициализации — блок кода, обязательно выполняемый при создании объекта независимо от того, с помощью какого конструктора этот объект создаётся. Помечается он словом init.



class Person(val name: String, var age: Int) {

var id: Int = 0



// require выдает ошибку с указанным текстом, если условие в левой части false

init {

require(name.isNotBlank(), { "У человека должно быть имя!" })

require(age > -1, { "Возраст не может быть отрицательным." })

}



constructor(name: String, age: Int, id: Int) : this(name, age) {

if (id > 0) this.id = id * 2

}

}



По сути блок инициализации — это способ настроить переменные или значения, а также проверить, что были переданы допустимые параметры. Код в блоке инициализации выполняется сразу после создания экземпляра класса, т.е. сразу после вызова основного конструктора. В классе может быть один или несколько блоков инициализации и выполняться они будут последовательно.



class Person(val name: String, var age: Int) {

// сначала вызывается основной конструктор и создаются свойства класса

// далее вызывается первый блок инициализации

init {

...

}



// после первого вызывается второй блок инициализации

    init {

...

}



// и т.д.

}



Блок инициализации может быть добавлен, даже если у класса нет основного конструктора. В этом случае его код будет выполнен раньше кода вторичных конструкторов.