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

У цій статті ви дізнаєтесь про конструктори в Kotlin (як про первинні, так і про вторинні конструктори), а також про блоки ініціалізаторів за допомогою прикладів.

Конструктор - це стислий спосіб ініціалізації властивостей класу.

Це спеціальна функція-член, яка викликається, коли об’єкт створюється за допомогою екземпляра (створюється). Однак те, як вони працюють у Котліні, дещо інше.

У Котліні є два конструктори:

  • Первинний конструктор - стислий спосіб ініціалізації класу
  • Вторинний конструктор - дозволяє поставити додаткову логіку ініціалізації

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

Первинний конструктор є частиною заголовка класу. Ось приклад:

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

Блок коду в круглі дужки є головним конструктором (val firstName: String, var age: Int).

Конструктор оголосив дві властивості: firstName(властивість лише для читання, оскільки вона оголошена за допомогою ключового слова val) та age(властивість read-write, як вона оголошена з ключовим словом 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 і вік оголошений.

Коли 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 замість зовсім іншого імені параметрів конструктора. Наприклад:

 клас 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 осіб2 є інстанцією Ім'я = Джек Вік = 0 особа3 є інстанцією Ім'я = НЕВІДОМИЙ Вік = 0

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

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

Вторинні конструктори не так поширені в Котліні. Найбільш поширене використання вторинного конструктора виникає, коли вам потрібно розширити клас, який надає кілька конструкторів, які ініціалізують клас різними способами. Не забудьте перевірити спадщину Котліна, перш ніж дізнатися про це.

Ось як ви можете створити вторинний конструктор у Kotlin:

 клас Log (конструктор (дані: String) (// деякий код) конструктор (data: String, numberOfData: Int) (// деякий код))

Тут Logклас має два вторинні конструктори, але не має основного конструктора.

Ви можете продовжити клас як:

 клас Log (конструктор (дані: String) (// код) конструктор (data: String, numberOfData: Int) (// code)) class AuthLog: Log (constructor (data: String): super (data) (// code ) конструктор (data: String, numberOfData: Int): super (data, numberOfData) (// code))

Тут конструктори похідного класу AuthLogвикликають відповідний конструктор базового класу Log. Для цього super()використовується.

У Kotlin ви також можете викликати конструктор з іншого конструктора того самого класу (як у Java), використовуючи this().

 клас AuthLog: Log (конструктор (дані: String): this (data, 10) (// code) конструктор (data: String, numberOfData: Int): super (data, numberOfData) (// code)) 

Приклад: вторинний конструктор Котліна

 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 разів

Примітка: Вторинний конструктор повинен ініціалізувати базовий клас або делегувати інший конструктор (як у наведеному вище прикладі), якщо клас не має основного конструктора.

Цікаві статті...