На этом шаге мы рассмотрим особенности такого объявления.
Обратите внимание на прямую связь параметров конструктора в Player и свойств класса: у вас есть параметр для каждого свойства класса, которое требуется инициализировать при создании игрока.
Для свойств с методами чтения и записи по умолчанию Kotlin позволяет объявить параметр и свойство в одном определении, без создания временной переменной. Свойство name использует нестандартные методы чтения и записи, поэтому для него такой подход использовать нельзя. Но можно для других свойств Player.
Измените код класса Player и объявите healthPoints, isBlessed и isImmortal как параметры главного конструктора Player. (Не забудьте удалить нижние подчеркивания перед именами переменных.)
class Player (_name: String, var healthPoints: Int, val isBlessed: Boolean, private val isImmortal: Boolean) { var name = _name get() = field.capitalize() private set(value) { field = value.trim() } . . . . }
Рис.1. Объявление свойств в первичном конструкторе (Game.kt)
Для каждого параметра конструктора вы указываете, будет ли он только для чтения или нет. Определяя параметры в конструкторе с помощью ключевых слов val и var, вы объявляете соответствующие свойства класса val или var, а также параметры, для которых конструктор будет ожидать аргументы. Вы также неявно присваиваете каждому свойству значение, которое передается в качестве аргумента.
Дублирование кода усложняет внесение изменений. Обычно мы предпочитаем именно этот способ объявления свойств класса, потому что он ведет к меньшему дублированию. Этот прием нельзя использовать для объявления свойства name, потому что оно имеет нестандартные методы чтения и записи, но в других случаях объявление свойства в первичном конструкторе - это хороший выбор.
На следующем шаге мы рассмотрим вспомогательные конструкторы.