Kotlina konstruktori un inicializētāji (ar piemēriem)

Šajā rakstā jūs uzzināsit par Kotlinas konstruktoriem (gan primārajiem, gan sekundārajiem konstruktoriem), kā arī par inicializatoru blokiem, izmantojot piemērus.

Konstruktors ir kodolīgs veids, kā inicializēt klases īpašības.

Tā ir īpaša dalībnieka funkcija, kas tiek izsaukta, kad objekts tiek instantificēts (izveidots). Tomēr tas, kā viņi strādā Kotlinā, ir nedaudz atšķirīgs.

Kotlīnā ir divi konstruktori:

  • Primārais konstruktors - kodolīgs klases inicializācijas veids
  • Sekundārais konstruktors - ļauj ievietot papildu inicializācijas loģiku

Galvenais konstruktors

Primārais konstruktors ir daļa no klases galvenes. Lūk, piemērs:

 klases persona (val firstName: String, var age: Int) (// klases ķermenis)

Koda bloks ieskauj iekavās ir galvenais konstruktors: (val firstName: String, var age: Int).

Konstruktors deklarēja divus rekvizītus: firstName(tikai lasāms rekvizīts, jo tas tiek deklarēts, izmantojot atslēgvārdu val) un age(rekvizīts lasīt-rakstīt, jo tas tiek deklarēts ar atslēgvārdu var).

Piemērs: primārais konstruktors

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

Palaidot programmu, izeja būs:

 Vārds = Džo vecums = 25

Kad Personklases objekts ir izveidots, "Joe"un 25vērtības tiek nodotas tā, it kā Persontā būtu funkcija.

Tas inicializē firstNameun ageperson1 objekta "Joe"un 25attiecīgi īpašības.

Ir arī citi primāro konstruktoru izmantošanas veidi.

Primārā konstruktora un inicializatora bloki

Primārajam konstruktoram ir ierobežota sintakse, un tajā nedrīkst būt neviena koda.

Lai ievietotu inicializācijas kodu (ne tikai kodu, lai inicializētu īpašības), tiek izmantots inicializētāja bloks. Tas tiek pievienots ar initatslēgvārdu. Pārveidosim iepriekš minēto piemēru ar inicializētāja bloku:

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

Palaidot programmu, izeja būs:

 First Name = Joe Age = 25

Šeit iekavās esošie parametri fName un personAge pieņem vērtības "Joe"un 25attiecīgi, kad tiek izveidots person1 objekts. Tomēr fName un personAge tiek izmantoti, neizmantojot varvai val, un tie nav Personklases īpašības .

PersonKlasē ir divas īpašības FirstName, un paziņoja vecuma.

Kad person1objekts ir izveidots, tiek izpildīts kods inicializētāja blokā. Inicializētāja bloks ne tikai inicializē tā īpašības, bet arī izdrukā tos.

Šeit ir vēl viens veids, kā veikt to pašu uzdevumu:

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

Lai nošķirtu konstruktora parametru un īpašību, tiek izmantoti dažādi vārdi (fName and firstName, personAge un age). Konstruktora parametriem biežāk tiek izmantots nosaukums _firstName un _age, nevis pilnīgi atšķirīgs nosaukums. Piemēram:

 klases persona (_firstName: virkne, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializētāja bloks init (…)) 

Sākotnējā konstruktora noklusējuma vērtība

Konstruktora parametriem varat norādīt noklusējuma vērtību (līdzīgi kā funkciju noklusējuma argumentu sniegšanai). Piemēram:

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

Palaidot programmu, izeja būs:

 Vārds = Džo Vecums = 25 persona2 tiek saīsināts Vārds = Džeks Vecums = 0 cilvēks3 ir instantificēts Vārds = Nezināms Vecums = 0

Kotlina sekundārais konstruktors

Kotlīnā klasē var būt arī viens vai vairāki sekundārie konstruktori. Tie ir izveidoti, izmantojot constructoratslēgvārdu.

Sekundārie konstruktori Kotlinā nav tik izplatīti. Visizplatītākais sekundārā konstruktora lietojums parādās, kad jums jāpaplašina klase, kas nodrošina vairākus konstruktorus, kuri inicializē klasi dažādos veidos. Pirms to uzzināt, noteikti pārbaudiet Kotlin mantojumu.

Lūk, kā jūs varat izveidot sekundāro konstruktoru Kotlīnā:

 klases žurnāls (konstruktors (dati: virkne) (// daži kods) konstruktors (dati: virkne, numursOfData: Int) (// kāds kods))

Šeit Logklasei ir divi sekundārie konstruktori, bet nav galvenā konstruktora.

Jūs varat paplašināt klasi kā:

 klases žurnāls (konstruktors (dati: virkne) (// kods) konstruktors (dati: virkne, numursOfData: Int) (// kods)) klase AuthLog: žurnāls (konstruktors (dati: virkne): super (dati) (// kods ) konstruktors (dati: virkne, numberOfData: Int): super (dati, numberOfData) (// kods))

Šeit atvasinātās klases AuthLogkonstruktori izsauc atbilstošo bāzes klases konstruktoru Log. Tam super()tiek izmantots.

Kotlinā jūs varat arī izsaukt konstruktoru no cita tās pašas klases konstruktora (piemēram, Java), izmantojot this().

 klase AuthLog: Žurnāls (konstruktors (dati: virkne): šis (dati, 10) (// kods) konstruktors (dati: String, numberOfData: Int): super (dati, numberOfData) (// kods)) 

Piemērs: Kotlina sekundārais konstruktors

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

Palaidot programmu, izeja būs:

 No AuthLog -> nepareiza parole: 10 reizes

Piezīme . Sekundārajam konstruktoram ir jāinicializē bāzes klase vai jāpiešķir citam konstruktoram (piemēram, iepriekš minētajā piemērā), ja klasē nav galvenā konstruktora.

Interesanti raksti...