Konstruktori i inicijatori Kotlin (s primjerima)

U ovom ćete članku uz primjere naučiti o konstruktorima u Kotlinu (i primarnim i sekundarnim konstruktorima), kao i blokovima inicijalizatora.

Konstruktor je jezgrovit način inicijalizacije svojstava klase.

To je posebna funkcija člana koja se poziva kada se objekt instancira (kreira). Međutim, način na koji rade u Kotlinu malo je drugačiji.

U Kotlinu postoje dva konstruktora:

  • Primarni konstruktor - koncizan način inicijalizacije klase
  • Sekundarni konstruktor - omogućuje vam stavljanje dodatne logike inicijalizacije

Primarni konstruktor

Primarni konstruktor dio je zaglavlja klase. Evo primjera:

 razred Osoba (val firstName: String, var age: Int) (// tijelo klase)

Blok koda okružen zagradama je primarni konstruktor: (val firstName: String, var age: Int).

Konstruktor je proglasio dva svojstva: firstName(svojstvo samo za čitanje kako je deklarirano pomoću ključne riječi val) i age(svojstvo čitanja i pisanja onako kako je deklarirano s ključnom riječi var).

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

Kada pokrenete program, izlaz će biti:

 Ime = Joe Age = 25

Kada Personse kreira objekt klase "Joe"i 25vrijednosti se predaju kao da Personje to funkcija.

Ovo inicijalizira firstNamei agesvojstva objekta person1 objekta "Joe"i 25.

Postoje i drugi načini korištenja primarnih konstruktora.

Primarni blokovi konstruktora i inicijalizatora

Primarni konstruktor ima ograničenu sintaksu i ne može sadržavati nijedan kôd.

Za stavljanje inicijalizacijskog koda (ne samo koda za inicijalizaciju svojstava) koristi se blok inicijalizatora. Prefiks je s initključnom riječi. Izmijenimo gornji primjer blokom inicijalizatora:

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

Kada pokrenete program, izlaz će biti:

 First Name = Joe Age = 25

Ovdje parametri fName i personAge unutar zagrade prihvaćaju vrijednosti "Joe", 25odnosno kada se stvara objekt person1. Međutim, fName i personAge koriste se bez upotrebe varili vali nisu svojstva Personklase.

PersonKlasa ima dva svojstva Ime, i dobi su proglašeni.

Kada se person1objekt kreira, izvršava se kod unutar bloka inicijalizatora. Blok inicijalizatora ne samo da inicijalizira svoja svojstva već ih i ispisuje.

Evo još jednog načina za izvršavanje istog zadatka:

 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 i svojstva konstruktora koriste se različiti nazivi (fName i firstName, i personAge i age). Uobičajenije je koristiti _firstName i _age umjesto potpuno drugog naziva za parametre konstruktora. Na primjer:

 klasa Osoba (_frName: String, _age: Int) (val FirstName = _firstName.capitalize () var age = _age // blok inicijalizatora init (…)) 

Zadana vrijednost u primarnom konstruktoru

Parametrima konstruktora možete pružiti zadanu vrijednost (slično pružanju zadanih argumenata funkcijama). Na primjer:

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

Kada pokrenete program, izlaz će biti:

 Ime = Joe Age = 25 osoba2 je instancirano Ime = Jack Age = 0 person3 je instantiated Ime = NEPOZNATO Age = 0

Kotlin sekundarni konstruktor

U Kotlinu klasa također može sadržavati jedan ili više sekundarnih konstruktora. Stvoreni su pomoću constructorključne riječi.

Sekundarni konstruktori nisu toliko česti u Kotlinu. Najčešća upotreba sekundarnog konstruktora dolazi kada trebate proširiti klasu koja pruža više konstruktora koji inicijaliziraju klasu na različite načine. Obavezno provjerite Kotlinov nasljedstvo prije nego što ga naučite.

Evo kako možete stvoriti sekundarni konstruktor u Kotlinu:

 klasa Zapisnik (konstruktor (podaci: String) (// neki kod) konstruktor (podaci: String, numberOfData: Int) (// neki kod))

Ovdje Logklasa ima dva sekundarna konstruktora, ali ne i primarni konstruktor.

Predavanje možete produžiti kao:

 klasa Log (konstruktor (podaci: String) (// kod) konstruktor (podaci: String, numberOfData: Int) (// kod)) klasa AuthLog: Log (konstruktor (podaci: String): super (podaci) (// kod ) konstruktor (podaci: String, numberOfData: Int): super (data, numberOfData) (// kod))

Ovdje konstruktori izvedene klase AuthLogpozivaju odgovarajući konstruktor osnovne klase Log. Za to super()se koristi.

U Kotlinu također možete nazvati konstruktor iz drugog konstruktora iste klase (kao u Javi) pomoću this().

 klasa AuthLog: Log (konstruktor (podaci: String): ovaj (podaci, 10) (// kod) konstruktor (podaci: String, numberOfData: Int): super (podaci, numberOfData) (// kod)) 

Primjer: Kotlin sekundarni konstruktor

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

Kada pokrenete program, izlaz će biti:

 Iz AuthLog -> Loša lozinka: 10 puta

Napomena: Sekundarni konstruktor mora inicijalizirati osnovnu klasu ili delegirati drugom konstruktoru (kao u gornjem primjeru) ako klasa nema primarni konstruktor.

Zanimljivi članci...