Konštruktory a inicializátory Kotlin (s príkladmi)

V tomto článku sa pomocou príkladov dozviete o konštruktoroch v Kotline (primárnych aj sekundárnych konštruktoroch), ako aj o inicializačných blokoch.

Konštruktor je stručný spôsob inicializácie vlastností triedy.

Je to špeciálna členská funkcia, ktorá sa volá, keď je objekt inštancovaný (vytvorený). Ako však fungujú v Kotline, je trochu iné.

V Kotline existujú dvaja konštruktéri:

  • Primárny konštruktor - stručný spôsob inicializácie triedy
  • Sekundárny konštruktor - umožňuje vám vložiť ďalšiu logiku inicializácie

Hlavný konštruktér

Primárny konštruktor je súčasťou hlavičky triedy. Tu je príklad:

 osoba triedy (val firstName: String, var age: Int) (// telo triedy)

Blok kódu obklopený zátvorkách je primárny konštruktor: (val firstName: String, var age: Int).

Konštruktor deklaroval dve vlastnosti: firstName( vlastnosť iba na čítanie, pretože je deklarovaná pomocou kľúčového slova val) a age(vlastnosť na čítanie a zápis, ako je deklarovaná pomocou kľúčového slova var).

Príklad: primárny konštruktor

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

Po spustení programu bude výstup:

 Meno = Joe Vek = 25

Keď Personsa vytvorí objekt triedy "Joe"a 25hodnoty sa odovzdajú, akoby išlo Persono funkciu.

Tento inicializuje firstNamea agevlastnosti člověka1 námietky proti "Joe"a 25v tomto poradí.

Existujú aj iné spôsoby použitia primárnych konštruktorov.

Primárne bloky konštruktéra a inicializátora

Primárny konštruktor má obmedzenú syntax a nemôže obsahovať žiadny kód.

Na vloženie inicializačného kódu (nielen kódu na inicializáciu vlastností) sa použije inicializačný blok. Je pred ním initkľúčové slovo. Upravme vyššie uvedený príklad blokovaním inicializátora:

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

Po spustení programu bude výstup:

 First Name = Joe Age = 25

Tu parametre fname a osobnosť vnútri zátvoriek prijíma hodnoty "Joe"a 25v tomto poradí, ak je vytvorený PERSON1 objektu. FName a personAge sa však používajú bez použitia znakov varalebo vala nie sú vlastnosťami Persontriedy.

PersonTrieda má dve vlastnosti krstné meno, vek a sú deklarované.

Po person1vytvorení objektu sa vykoná kód vo vnútri bloku inicializátora. Inicializačný blok nielen inicializuje svoje vlastnosti, ale aj ich tlačí.

Tu je ďalší spôsob, ako vykonať rovnakú úlohu:

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

Na rozlíšenie parametra a vlastnosti konštruktora sa používajú rôzne mená (fName a firstName a personAge a age). Bežnejšie je používať pre parametre konštruktora namiesto úplne iného názvu _firstName a _age. Napríklad:

 trieda Osoba (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializačný blok init (…)) 

Predvolená hodnota v primárnom konštruktore

Parametrom konštruktora môžete poskytnúť predvolenú hodnotu (podobne ako pri poskytovaní predvolených argumentov funkciám). Napríklad:

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

Po spustení programu bude výstup:

 Krstné meno = Joe Vek = 25 osôb2 je inštancovaných Krstné meno = Jack Vek = 0 osôb3 je inštancovaných Krstné meno = NEZNÁMY Vek = 0

Kotlin sekundárny konštruktér

V Kotline môže trieda obsahovať aj jedného alebo viacerých sekundárnych konštruktorov. Sú vytvorené pomocou constructorkľúčového slova.

Sekundárne konštruktory nie sú v Kotline také bežné. Najčastejšie použitie sekundárneho konštruktora nastane, keď potrebujete rozšíriť triedu, ktorá poskytuje viac konštruktorov, ktoré inicializujú triedu rôznymi spôsobmi. Než sa to naučíte, nezabudnite skontrolovať dedičstvo Kotlin.

Tu je príklad, ako môžete vytvoriť sekundárny konštruktor v Kotline:

 trieda Log (konštruktor (dáta: String) (// nejaký kód) konštruktor (dáta: String, numberOfData: Int) (// nejaký kód))

Tu je Logtrieda má dve sekundárne konštruktory, ale žiadne primárne konštruktor.

Triedu môžete rozšíriť ako:

 trieda Log (konštruktor (údaje: String) (// kód) konštruktor (údaje: String, numberOfData: Int) (// kód)) trieda AuthLog: Log (konštruktor (údaje: String): super (údaje) (// kód) ) konštruktor (data: String, numberOfData: Int): super (data, numberOfData) (// kód))

Tu konštruktory odvodenej triedy AuthLognazývajú zodpovedajúci konštruktor základnej triedy Log. Na to super()sa používa.

V Kotline môžete tiež zavolať konštruktor z iného konštruktora rovnakej triedy (napríklad v Jave) pomocou this().

 trieda AuthLog: Log (konštruktor (dáta: String): tento (dáta, 10) (// kód) konštruktor (dáta: String, numberOfData: Int): super (data, numberOfData) (// kód)) 

Príklad: Kotlin Secondary Constructor

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

Po spustení programu bude výstup:

 Z AuthLog -> Chybné heslo: 10-krát

Poznámka: Ak trieda nemá primárneho konštruktora, musí sekundárny konštruktor inicializovať základnú triedu alebo delegovať na iného konštruktora (ako vo vyššie uvedenom príklade).

Zaujímavé články...