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 Person
luokan objekti luodaan "Joe"
ja 25
arvot välitetään ikään kuin Person
se olisi funktio.
Tämä alustaa firstName
ja age
ominaisuudet PERSON1 vastustaa "Joe"
ja 25
vastaavasti.
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 init
avainsana. 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 25
vastaavasti, kun person1-objekti luodaan. FName ja personAge käytetään kuitenkin käyttämättä var
tai val
, eivätkä ne ole Person
luokan ominaisuuksia .
Person
Luokalla on kaksi ominaisuutta etunimi ja ikä ilmoitetaan.
Kun person1
objekti 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 constructor
avainsanalla.
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ä Log
luokassa 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.