Конструкторы и инициализаторы Kotlin (с примерами)

В этой статье вы узнаете о конструкторах в Kotlin (как первичных, так и вторичных конструкторах), а также о блоках инициализаторов с помощью примеров.

Конструктор - это краткий способ инициализировать свойства класса.

Это специальная функция-член, которая вызывается при создании (создании) объекта. Однако то, как они работают в Котлине, немного отличается.

В Котлине есть два конструктора:

  • Первичный конструктор - краткий способ инициализации класса
  • Вторичный конструктор - позволяет поставить дополнительную логику инициализации

Основной конструктор

Основной конструктор является частью заголовка класса. Вот пример:

 class Person (val firstName: String, var age: Int) (// тело класса)

Блок кода в круглые скобки является основным конструктором (val firstName: String, var age: Int).

Конструктор объявил два свойства: firstName(свойство только для чтения, объявленное с помощью ключевого слова val) и age(свойство чтения-записи, объявленное с ключевым словом var).

Пример: основной конструктор

 fun main(args: Array) ( val person1 = Person("Joe", 25) println("First Name = $(person1.firstName)") println("Age = $(person1.age)") ) class Person(val firstName: String, var age: Int) ( )

Когда вы запустите программу, вывод будет:

 Имя = Джо Возраст = 25

Когда объект Personкласса создается, "Joe"и 25значения передаются, как если бы Personэто функция.

Это инициализирует firstNameи ageсвойства объекта person1 для "Joe"и 25соответственно.

Есть и другие способы использования первичных конструкторов.

Блоки первичного конструктора и инициализатора

Основной конструктор имеет ограниченный синтаксис и не может содержать никакого кода.

Для размещения кода инициализации (а не только кода для инициализации свойств) используется блок инициализатора. Перед ним стоит initключевое слово. Давайте изменим приведенный выше пример с помощью блока инициализатора:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName: String var age: Int // initializer block init ( firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") ) )

Когда вы запустите программу, вывод будет:

 First Name = Joe Age = 25

Здесь параметры fName и personAge внутри круглых скобок принимают значения "Joe"и 25соответственно при создании объекта person1. Однако fName и personAge используются без использования varили valи не являются свойствами Personкласса.

В Personклассе объявлены два свойства firstName и age.

Когда person1объект создается, выполняется код внутри блока инициализатора. Блок инициализатора не только инициализирует свои свойства, но и печатает их.

Вот еще один способ выполнить ту же задачу:

 fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName = fName.capitalize() var age = personAge // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Чтобы различать параметр и свойство конструктора, используются разные имена (fName и firstName, а также personAge и age). Чаще используется _firstName и _age вместо совершенно разных имен для параметров конструктора. Например:

 class Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // инициализатор блока init (…)) 

Значение по умолчанию в основном конструкторе

Вы можете указать значение по умолчанию для параметров конструктора (аналогично предоставлению аргументов по умолчанию для функций). Например:

 fun main(args: Array) ( println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() ) class Person(_firstName: String = "UNKNOWN", _age: Int = 0) ( val firstName = _firstName.capitalize() var age = _age // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )

Когда вы запустите программу, вывод будет:

 Имя = Возраст Джо = 25 создан экземпляр person2 Имя = Возраст Джека = 0 создан экземпляр person3 Имя = НЕИЗВЕСТНО Возраст = 0

Котлин Вторичный конструктор

В Kotlin класс также может содержать один или несколько вторичных конструкторов. Они созданы с использованием constructorключевого слова.

Вторичные конструкторы в Котлине не так распространены. Чаще всего вторичный конструктор используется, когда вам нужно расширить класс, который предоставляет несколько конструкторов, которые инициализируют класс разными способами. Обязательно проверьте Kotlin Inheritance, прежде чем изучать его.

Вот как вы можете создать вторичный конструктор в Kotlin:

 class Log (constructor (data: String) (// некоторый код) constructor (data: String, numberOfData: Int) (// некоторый код))

Здесь у Logкласса есть два вторичных конструктора, но нет первичного конструктора.

Вы можете расширить класс как:

 class Log (constructor (data: String) (// код) constructor (data: String, numberOfData: Int) (// code)) class AuthLog: Log (constructor (data: String): super (data) (// код ) constructor (data: String, numberOfData: Int): super (data, numberOfData) (// код))

Здесь конструкторы производного класса AuthLogвызывают соответствующий конструктор базового класса Log. Для этого super()используется.

В Kotlin вы также можете вызвать конструктор из другого конструктора того же класса (например, в Java), используя this().

 class AuthLog: Log (constructor (data: String): this (data, 10) (// код) constructor (data: String, numberOfData: Int): super (data, numberOfData) (// код)) 

Пример: вторичный конструктор Kotlin

 fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> " + _data, 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )

Когда вы запустите программу, вывод будет:

 Из AuthLog -> Неверный пароль: 10 раз

Примечание . Вторичный конструктор должен инициализировать базовый класс или делегировать другому конструктору (как в примере выше), если у класса нет основного конструктора.

Интересные статьи...