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 Person
se kreira objekt klase "Joe"
i 25
vrijednosti se predaju kao da Person
je to funkcija.
Ovo inicijalizira firstName
i age
svojstva 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 init
ključ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"
, 25
odnosno kada se stvara objekt person1. Međutim, fName i personAge koriste se bez upotrebe var
ili val
i nisu svojstva Person
klase.
Person
Klasa ima dva svojstva Ime, i dobi su proglašeni.
Kada se person1
objekt 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 constructor
ključ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 Log
klasa 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 AuthLog
pozivaju 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.