Kotlini konstruktorid ja initsialiseerijad (koos näidetega)

Lang L: none (table-of-contents)

Sellest artiklist saate näidete abil teada nii Kotlini konstruktorite (nii esmaste kui ka teiseste ehitajate) kui ka initsiaatoriplokkide kohta.

Konstruktor on kokkuvõtlik viis klassi omaduste initsialiseerimiseks.

See on liikme erifunktsioon, mida kutsutakse objekti instantiseerimisel (loomisel). Kuidas nad Kotlinis töötavad, on siiski veidi erinev.

Kotlinis on kaks konstruktorit:

  • Esmane konstruktor - ülevaatlik viis klassi initsialiseerimiseks
  • Sekundaarne konstruktor - võimaldab teil lisada täiendava initsialiseerimise loogika

Esmane konstruktor

Esmane konstruktor on osa klassi päisest. Siin on näide:

 klass Isik (val eesnimi: String, vanus: keskmine) (// klassi keha)

Ploki kood ümbritsetud sulgudes on peamine ehitaja: (val firstName: String, var age: Int).

Konstruktor deklareeris kaks omadust: firstName(kirjutuskaitstud atribuut, kuna see deklareeritakse märksõna abil val) ja age(kirjutamise ja kirjutamise omadus, kuna see deklareeritakse märksõnaga var).

Näide: esmane 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) ( )

Programmi käivitamisel on väljund järgmine:

 Eesnimi = Joe vanus = 25

Kui Personklassi objekt luuakse "Joe"ja 25väärtused edastatakse justkui Personfunktsioonina.

See Lähtestab firstNameja ageomadusi PERSON1 vastuväiteid "Joe"ja 25vastavalt.

Primaarkonstruktorite kasutamiseks on ka teisi viise.

Esmase konstruktori ja initsialiseerija plokid

Primaarkonstruktoril on piiratud süntaks ja see ei tohi sisaldada ühtegi koodi.

Initsialiseerimiskoodi (mitte ainult omaduste lähtestamiseks mõeldud koodi) sisestamiseks kasutatakse lähtestusplokki. Selle ees on initmärksõna. Muutkem ülaltoodud näidet initsiaatori plokiga:

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

Programmi käivitamisel on väljund järgmine:

 First Name = Joe Age = 25

Siin aktsepteerivad sulgudes olevad parameetrid fName ja personAge väärtusi "Joe"ja 25vastavalt objekti person1 loomisel. Kuid fName ja personAge kasutatakse ilma varvõi kasutamata ega valole Personklassi omadused .

PersonKlassis on kaks omaduste firstName ja vanus on deklareeritud.

Kui person1objekt on loodud, kood sees aktiveerijas plokk täidetakse. Algatajate plokk mitte ainult ei initsialiseeri selle omadusi, vaid ka prindib need.

Siin on veel üks viis sama ülesande täitmiseks:

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

Konstruktori parameetri ja omaduse eristamiseks kasutatakse erinevaid nimesid (fName ja eesnimi ning personAge ja vanus). Tavalisem on konstruktori parameetrite jaoks täiesti erineva nime asemel kasutada _firstName ja _age. Näiteks:

 klassi isik (_firstName: String, _age: Int) (val eesnimi = _firstName.capitalize () var age = _age // initsiaatori plokk init (…)) 

Esmase konstruktori vaikeväärtus

Konstruktori parameetritele saate anda vaikeväärtuse (sarnaselt funktsioonide vaikeargumentide pakkumisele). Näiteks:

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

Programmi käivitamisel on väljund järgmine:

 Eesnimi = Joe vanus = 25 inimest2 on kohandatud Eesnimi = Jack vanus = 0 inimene3 on kohandatud eesnimi = tundmatu vanus = 0

Kotlini sekundaarkonstruktor

Kotlinis võib klass sisaldada ka ühte või mitut sekundaarset konstruktorit. Need on loodud constructormärksõna abil.

Sekundaarkonstruktorid pole Kotlinis nii levinud. Sekundaarse konstruktori kõige tavalisem kasutamine ilmneb siis, kui peate laiendama klassi, mis pakub mitut konstruktorit, kes lähtestavad klassi erineval viisil. Enne selle õppimist kontrollige kindlasti Kotlini pärandit.

Kotlinis saate teisese konstruktori luua järgmiselt:

 klass Log (konstruktor (andmed: String) (// mõni kood) konstruktor (andmed: String, numberOfData: Int) (// mõni kood))

Siin on Logklassil kaks sekundaarkonstruktorit, kuid primaarehitajaid pole.

Kursust saate pikendada järgmiselt:

 class Log (konstruktor (andmed: String) (// kood) konstruktor (andmed: String, numberOfData: Int) (// kood)) klass AuthLog: Logi (konstruktor (andmed: String): super (andmed) (// kood ) konstruktor (andmed: String, numberOfData: Int): super (andmed, numberOfData) (// kood))

Siin AuthLognimetavad tuletatud klassi konstruktorid baasklassi vastavat konstruktorit Log. Selleks super()kasutatakse.

Kotlinis saate helistada ka konstruktori teiselt sama klassi konstruktorilt (nagu Java-s), kasutades this().

 klass AuthLog: Logi (konstruktor (andmed: string): see (andmed, 10) (// kood) konstruktor (andmed: String, numberOfData: Int): super (andmed, numberOfData) (// kood)) 

Näide: Kotlini sekundaarkonstruktor

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

Programmi käivitamisel on väljund järgmine:

 AuthLogist -> Vale parool: 10 korda

Märkus . Sekundaarkonstruktor peab lähtestama baasklassi või delegeerima teisele konstruktorile (nagu ülaltoodud näites), kui klassil pole esmast konstruktorit.

Huvitavad Artiklid...