Kotlinovi konstruktorji in inicializatorji (z primeri)

V tem članku boste s pomočjo primerov spoznali konstruktorje v Kotlinu (tako primarne kot sekundarne konstruktorje) kot tudi bloke inicializatorjev.

Konstruktor je jedrnat način za inicializacijo lastnosti razreda.

To je posebna funkcija člana, ki se pokliče, ko se objekt ustvari (ustvari). Vendar je način dela v Kotlinu nekoliko drugačen.

V Kotlinu sta dva konstruktorja:

  • Primarni konstruktor - jedrnat način inicializacije razreda
  • Sekundarni konstruktor - omogoča dodajanje logike inicializacije

Primarni konstruktor

Primarni konstruktor je del glave razreda. Tu je primer:

 class Person (val firstName: String, var age: Int) (// telo razreda)

Blok kode obdan z oklepaji je glavni konstruktor: (val firstName: String, var age: Int).

Konstruktor je razglasil dve lastnosti: firstName( lastnost samo za branje, saj je navedena s ključno besedo val) in age(lastnost branja in pisanja, kot je navedena s ključno besedo var).

Primer: Primarni konstruktor

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

Ko zaženete program, bo rezultat:

 Ime = Joe Age = 25

Ko je predmet Personrazreda ustvarjen "Joe"in se 25vrednosti posredujejo, kot da Personje funkcija.

To inicializira firstNamein agelastnosti predmeta person1 za "Joe"in 25.

Obstajajo tudi drugi načini uporabe primarnih konstruktorjev.

Primarni konstruktorski in inicializacijski bloki

Primarni konstruktor ima omejeno sintakso in ne sme vsebovati nobene kode.

Za namestitev iniciacijske kode (ne samo kode za inicializacijo lastnosti) se uporabi blok inicializatorja. Predpona je s initključno besedo. Spremenimo zgornji primer z blokom inicializatorja:

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

Ko zaženete program, bo rezultat:

 First Name = Joe Age = 25

Tukaj, parametri fname in osebnost znotraj oklepaju sprejema vrednote "Joe"in 25v tem zaporedju, ko je ustvaril PERSON1 objekt. Vendar se fName in personAge uporabljata brez uporabe varali valin nista lastnosti Personrazreda.

PersonRazred ima dve lastnosti priimka, in starost se razglasijo.

Ko je person1objekt ustvarjen, se izvede koda znotraj bloka inicializatorja. Inicializacijski blok ne samo inicializira svoje lastnosti, temveč jih tudi natisne.

Tu je še en način za izvajanje iste naloge:

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

Za razlikovanje parametra in lastnosti konstruktorja se uporabljajo različna imena (fName in firstName ter personAge in age). Pogosteje je uporaba parametrov _firstName in _age namesto povsem drugačnega imena za parametre konstruktorja. Na primer:

 razred Oseba (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializacijski blok init (…)) 

Privzeta vrednost v primarnem konstruktorju

Parametrom konstruktorja lahko zagotovite privzeto vrednost (podobno kot privzeti argumenti za funkcije). Na primer:

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

Ko zaženete program, bo rezultat:

 Ime = Joe Age = 25 oseba2 je instantiated Ime = Jack Age = 0 person3 je instantiated Ime = NEZNANO Age = 0

Kotlin Sekundarni konstruktor

V Kotlinu lahko razred vsebuje tudi enega ali več sekundarnih konstruktorjev. Ustvarjeni so s constructorključno besedo.

Sekundarni konstruktorji v Kotlinu niso tako pogosti. Najpogostejša uporaba sekundarnega konstruktorja se pojavi, ko morate razširiti razred, ki ponuja več konstruktorjev, ki razred inicializirajo na različne načine. Preden se tega naučite, preverite nasledstvo Kotlin.

Evo, kako lahko v Kotlinu ustvarite sekundarni konstruktor:

 class Log (konstruktor (data: String) (// nekaj kode) konstruktor (data: String, numberOfData: Int) (// nekaj kode))

Tu ima Lograzred dva sekundarna konstruktorja, ne pa tudi primarnega konstruktorja.

You can extend the class as:

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

Here, constructors of the derived class AuthLog calls the corresponding constructor of the base class Log. For that, super() is used.

In Kotlin, you can also call a constructor from another constructor of the same class (like in Java) using this().

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

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

When you run the program, the output will be:

 Iz programa AuthLog -> Bad Password: 10-krat

Opomba: Sekundarni konstruktor mora inicializirati osnovni razred ali ga pooblastiti za drug konstruktor (kot v zgornjem primeru), če razred nima primarnega konstruktorja.

Zanimive Članki...