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

У овом чланку ћете научити о конструкторима у Котлину (и примарним и секундарним конструкторима), као и блоковима иницијализатора уз помоћ примера.

Конструктор је концизан начин иницијализације својстава класе.

То је посебна функција члана која се позива када се објект инстанцира (креира). Међутим, начин њиховог рада у Котлину је мало другачији.

У Котлину постоје два конструктора:

  • Примарни конструктор - концизан начин иницијализације класе
  • Секундарни конструктор - омогућава вам стављање додатне логике иницијализације

Примарни конструктор

Примарни конструктор је део заглавља класе. Ево примера:

 цласс Персон (вал фирстНаме: Стринг, вар аге: Инт) (// тело класе)

Блок кода окружен заградама је примарни конструктор: (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својства објекта персон1 за "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

Овде параметри фНаме и персонАге унутар заграде прихватају вредности "Joe", 25односно када се креира објекат персон1. Међутим, фНаме и персонАге се користе без употребе varили valи нису својства Personкласе.

PersonКласа има два својства фирстнаме, и прогласио старости.

Када се 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") ) )

Да би се разликовали параметар и својство конструктора, користе се различита имена (фНаме и фирстНаме, и персонАге и аге). Уобичајеније је користити _фирстНаме и _аге уместо потпуно другог имена за параметре конструктора. На пример:

 класа Персон (_фирстНаме: Стринг, _аге: Инт) (вал фирстНаме = _фирстНаме.цапитализе () вар аге = _аге // иницијализатор блок инит (…)) 

Подразумевана вредност у примарном конструктору

Параметрима конструктора можете пружити задану вриједност (слично пружању заданих аргумената функцијама). На пример:

 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

Котлин секундарни конструктор

У Котлину класа такође може садржати један или више секундарних конструктора. Створени су помоћу constructorкључне речи.

Секундарни конструктори нису толико чести у Котлину. Најчешћа употреба секундарног конструктора јавља се када треба да проширите класу која пружа вишеструке конструкторе који иницијализују класу на различите начине. Обавезно проверите наследство Котлина пре него што га научите.

Ево како можете да креирате секундарни конструктор у Котлину:

 класа Лог (конструктор (подаци: Стринг) (// неки код) конструктор (подаци: Стринг, нумберОфДата: Инт) (// неки код))

Овде Logкласа има два секундарна конструктора, али не и примарни конструктор.

Можете продужити час као:

 класа Лог (конструктор (подаци: Стринг) (// код) конструктор (подаци: Стринг, нумберОфДата: Инт) (// код)) класа АутхЛог: Лог (конструктор (подаци: Стринг): супер (подаци) (// код ) конструктор (подаци: Стринг, нумберОфДата: Инт): супер (дата, нумберОфДата) (// код))

Овде конструктори изведене класе AuthLogпозивају одговарајући конструктор основне класе Log. За то super()се користи.

У Котлину такође можете позвати конструктор из другог конструктора исте класе (као у Јави) користећи this().

 класа АутхЛог: Лог (конструктор (подаци: Стринг): овај (подаци, 10) (// код) конструктор (подаци: Стринг, нумберОфДата: Инт): супер (подаци, нумберОфДата) (// код)) 

Пример: Котлин секундарни конструктор

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

Када покренете програм, излаз ће бити:

 Из АутхЛог -> Лоша лозинка: 10 пута

Напомена: Секундарни конструктор мора иницијализовати основну класу или делегирати другом конструктору (као у горњем примеру) ако класа нема примарни конструктор.

Занимљиви Чланци...