Kotlinin rakentajat ja alustajat (esimerkkejä)

Tässä artikkelissa opit Kotlinin rakentajista (sekä pää- että sekundäärirakentajista) sekä alustuslohkoista esimerkkien avulla.

Rakentaja on tiivis tapa alustaa luokan ominaisuudet.

Se on erityinen jäsenfunktio, jota kutsutaan, kun objekti instantisoidaan (luodaan). Kuinka he työskentelevät Kotlinissa, on kuitenkin hieman erilainen.

Kotlinissa on kaksi rakentajaa:

  • Ensisijainen rakentaja - tiivis tapa alustaa luokka
  • Toissijainen konstruktori - antaa sinun lisätä alustuslogiikkaa

Ensisijainen rakentaja

Ensisijainen konstruktori on osa luokan otsikkoa. Tässä on esimerkki:

 luokka Henkilö (val etunimi: Merkkijono, vaihteleva ikä: Int) (// luokka

Lohko-koodi, jota ympäröi suluissa on ensisijainen rakentaja: (val firstName: String, var age: Int).

Rakentaja ilmoitti kaksi ominaisuutta: firstName(vain luku -ominaisuus, kun se ilmoitetaan avainsanalla val) ja age(luku-kirjoita-ominaisuus, kun se ilmoitetaan avainsanalla var).

Esimerkki: Ensisijainen rakentaja

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

Kun suoritat ohjelmaa, tulos on:

 Etunimi = Joe Ikä = 25

Kun Personluokan objekti luodaan "Joe"ja 25arvot välitetään ikään kuin Personse olisi funktio.

Tämä alustaa firstNameja ageominaisuudet PERSON1 vastustaa "Joe"ja 25vastaavasti.

On myös muita tapoja käyttää pääkonstruktoreita.

Ensisijaiset rakennus- ja alustuslohkot

Ensisijaisella konstruktorilla on rajoitettu syntakse, eikä se voi sisältää koodia.

Käynnistyskoodin (ei vain ominaisuuksien alustamiseksi tarkoitetun koodin) asettamiseksi käytetään alustuslohkoa. Sen etuliite on initavainsana. Muutetaan yllä olevaa esimerkkiä alustuslohkolla:

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

Kun suoritat ohjelmaa, tulos on:

 First Name = Joe Age = 25

Tässä suluissa olevat parametrit fName ja personAge hyväksyvät arvot "Joe"ja 25vastaavasti, kun person1-objekti luodaan. FName ja personAge käytetään kuitenkin käyttämättä vartai val, eivätkä ne ole Personluokan ominaisuuksia .

PersonLuokalla on kaksi ominaisuutta etunimi ja ikä ilmoitetaan.

Kun person1objekti luodaan, alustuslohkon sisällä oleva koodi suoritetaan. Alustuslohko paitsi alustaa sen ominaisuudet myös tulostaa ne.

Tässä on toinen tapa suorittaa sama tehtävä:

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

Konstruktorin parametrin ja ominaisuuden erottamiseksi käytetään eri nimiä (fName ja firstName sekä personAge ja age). Yleisempää on käyttää _firstName ja _age rakentajan parametrien täysin eri nimen sijaan. Esimerkiksi:

 luokka Henkilö (_ etunimi: merkkijono, _ ikä: Int) (val etunimi = _ etunimi.capitalize () var ikä = _age // alustuslohko init (…)) 

Oletusarvo ensisijaisessa rakennuttajassa

Voit antaa oletusarvon rakentajan parametreille (samanlainen kuin oletusarvojen antaminen funktioille). Esimerkiksi:

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

Kun suoritat ohjelmaa, tulos on:

 Etunimi = Joe Ikä = 25 henkilöä2 on instantoitu Etunimi = Jack Ikä = 0 henkilö3 on instantioitu Etunimi = Tuntematon ikä = 0

Kotlinin toissijainen rakentaja

Kotlinissa luokka voi sisältää myös yhden tai useamman toissijaisen rakentajan. Ne luodaan constructoravainsanalla.

Toissijaiset rakentajat eivät ole niin yleisiä Kotlinissa. Toissijaisen rakentajan yleisin käyttö tulee esiin, kun sinun on laajennettava luokkaa, joka tarjoaa useita rakentajia, jotka alustavat luokan eri tavoin. Muista tarkistaa Kotlin-perintö ennen kuin opit sen.

Näin voit luoda toissijaisen rakentajan Kotliniin:

 class Log (konstruktori (data: String) (// jokin koodi) konstruktori (data: String, numberOfData: Int) (// jokin koodi))

Tässä Logluokassa on kaksi toissijaista konstruktoria, mutta ei ensisijaista rakentajaa.

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:

 AuthLogista -> Virheellinen salasana: 10 kertaa

Huomaa: Toissijaisen konstruktorin on alustettava perusluokka tai delegoitava toiselle rakentajalle (kuten yllä olevassa esimerkissä), jos luokassa ei ole ensisijaista konstruktoria.

Mielenkiintoisia artikkeleita...