Шаг 152.
Основы Kotlin.
Инициализация. Вспомогательные конструкторы

    На этом шаге мы рассмотрим особенности использования вспомогательных конструкторов.

    Конструкторы бывают двух видов: главные и вспомогательные. Объявляя главный конструктор, вы говорите: "Эти параметры нужны для любого экземпляра этого класса". Объявляя вспомогательный конструктор, вы определяете альтернативный способ создания класса (который соответствует требованиям главного конструктора).

    Вспомогательный конструктор должен вызывать главный конструктор, передавая ему все требуемые аргументы, или другой вспомогательный конструктор, который следует тому же правилу. Например, вы знаете, что в большинстве случаев игрок начнет игру с уже имеющимися 100 очками здоровья, будет благословлен и смертен. Можете объявить вспомогательный конструктор, автоматически устанавливающий эти значения. Добавьте вспомогательный конструктор в 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()
        }

    constructor(name: String) : this(name,
            healthPoints = 100,
            isBlessed = true,
            isImmortal = false)
    .   .   .   . 
}


Рис.1. Объявление вспомогательного конструктора (Player.kt)

    Можно объявить несколько вспомогательных конструкторов для различных комбинаций параметров. Вспомогательный конструктор вызывает главный конструктор с полным набором параметров. Ключевое слово this в данном случае ссылается на экземпляр класса, для которого объявлен конструктор. Конкретно в этом случае this вызывает другой конструктор, объявленный внутри класса, - главный конструктор.

    Так как вспомогательный конструктор определяет значения по умолчанию для healthPoints, isBlessed и isImmortal, вам не придется передавать аргументы для этих параметров при его вызове. Вызовите вспомогательный конструктор для Player из Game.kt вместо главного конструктора.

fun main() {
    val player = Player("Madrigal")
    player.castFireball()
    .   .   .   .
}


Рис.2. Вызов вспомогательного конструктора (Game.kt)

    Во вспомогательном конструкторе можно определить также логику инициализации - код, выполняющийся в момент создания экземпляра класса. Например, добавьте выражение, уменьшающее здоровье игрока до 40, если его зовут Kar.

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()
        }

    constructor(name: String) : this(name,
            healthPoints = 100,
            isBlessed = true,
            isImmortal = false) {
        if (name.toLowerCase() == "kar") healthPoints = 40
    }
    .   .   .   . 
}
Файл с проектом можно взять здесь.


Рис.3. Добавление логики вторичному конструктору (Player.kt)

    Хотя во вторичном конструкторе можно определить альтернативную логику инициализации, в нем, в отличие от главного конструктора, нельзя объявить свойства. Свойства класса можно объявить только в главном конструкторе или на уровне класса.

    Запустите Game.kt, и вы увидите, что герой благословлен и имеет 100 очков здоровья (рисунок 4); это доказывает, что экземпляр Player был создан вызовом вспомогательного конструктора.


Рис.4. Результат выполнения приложения

    На следующем шаге мы рассмотрим аргументы по умолчанию.




Предыдущий шаг Содержание Следующий шаг