На этом шаге мы рассмотрим создание и использование блока инициализации.
Помимо главного и вспомогательных конструкторов, в Kotlin можно указать блок инициализации для класса. Блок инициализации - это способ настроить переменные или значения, а также произвести их проверку, то есть убедиться, что конструктору переданы допустимые аргументы. Код в блоке инициализации выполняется сразу после создания экземпляра класса.
Например, при создании игрока к нему предъявляется ряд требований: игрок должен начать игру хотя бы с одним очком здоровья, а имя не должно быть пустым.
Воспользуйтесь блоком инициализации, обозначенным ключевым словом init, для проверки этих требований.
class Player (_name: String, var healthPoints: Int = 100, val isBlessed: Boolean, private val isImmortal: Boolean) { var name = _name get() = field.capitalize() private set(value) { field = value.trim() } init { require(healthPoints > 0, { "healthPoints must be greater than zero." }) require(name.isNotBlank(), { "Player must have a name." }) } constructor(name: String) : this(name, isBlessed = true, isImmortal = false) { if (name.toLowerCase() == "kar") healthPoints = 40 } . . . . }
Рис.1. Объявление блока инициализации (Player.kt)
Если хотя бы одно из условий не выполнится, будет возбуждено исключение IllegalArgumentException (можете проверить это в Kotlin REPL, передав в Player другие параметры).
Эти требования сложно реализовать в конструкторе или в объявлении свойства. Код в блоке инициализации вызывается сразу после создания экземпляра. При этом неважно, какой конструктор вызывался - главный или вспомогательный.
На следующем шаге мы рассмотрим инициализацию свойств.