Ebben a cikkben a Kotlin-i kivitelezőkről (elsődleges és másodlagos kivitelezőkről), valamint az inicializáló blokkokról tudhat meg példákat.
A konstruktor az osztály tulajdonságainak inicializálásának tömör módja.
Ez egy speciális tagfüggvény, amelyet akkor hívnak meg, amikor egy objektumot példányosítanak (létrehoznak). Azonban hogyan működnek Kotlinban, kissé más.
Kotlinban két kivitelező létezik:
- Elsődleges konstruktor - tömör módszer az osztály inicializálására
- Másodlagos konstruktor - további inicializálási logikát tesz lehetővé
Elsődleges kivitelező
Az elsődleges konstruktor az osztályfejléc része. Íme egy példa:
class Person (val firstName: String, var age: Int) (// osztálytest)
A blokk-kód körülvéve zárójelben az elsődleges kivitelező: (val firstName: String, var age: Int)
.
A konstruktor két tulajdonságot deklarált: firstName
(csak olvasható tulajdonság, amint azt a kulcsszóval deklarálják val
) és age
(írás-olvasás tulajdonság, amint azt kulcsszóval deklarálják var
).
Példa: Elsődleges kivitelező
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) ( )
A program futtatásakor a kimenet a következő lesz:
Keresztnév = Joe életkor = 25
Amikor Person
létrehozzák az osztály objektumát , "Joe"
és az 25
értékeket úgy adják át, mintha Person
egy függvény lenne.
Ez inicializálja firstName
és age
tulajdonságait person1 kifogás "Joe"
és 25
rendre.
Az elsődleges konstruktorok más módon is használhatók.
Elsődleges konstruktor és inicializáló blokkok
Az elsődleges konstruktor szintaxisa korlátozott, kódot nem tartalmazhat.
Az inicializáló kód (nem csak a tulajdonságok inicializálására szolgáló kód) elhelyezéséhez inicializáló blokkot használnak. A init
kulcsszó előtagja . Módosítsuk a fenti példát az inicializáló blokkkal:
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") ) )
A program futtatásakor a kimenet a következő lesz:
First Name = Joe Age = 25
Itt a zárójelben lévő fName és personAge paraméterek elfogadják az értékeket "Joe"
, 25
illetve a person1 objektum létrehozásakor. Az fName és a personAge azonban a var
vagy használata nélkül használatos val
, és nem az Person
osztály tulajdonságai .
Az Person
osztálynak két tulajdonsága van: firstName, és az életkor meg van adva.
Amikor person1
objektum jön létre, kód belsejében inicializálóblokkban kerül végrehajtásra. Az inicializáló blokk nem csak inicializálja tulajdonságait, hanem ki is nyomtatja azokat.
Itt van egy másik módszer ugyanazon feladat végrehajtására:
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") ) )
A konstruktor paraméterének és tulajdonságának megkülönböztetéséhez különböző neveket használnak (fNév és keresztnév, valamint személyKor és életkor). Gyakoribb, hogy a _firstName és a _age értékeket használják a konstruktor paramétereinek teljesen más neve helyett. Például:
class Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializáló blokk init (…))
Alapértelmezett érték az Elsődleges Konstruktorban
Alapértelmezett értéket adhat meg a konstruktor paramétereinek (hasonlóan, mint az alapértelmezett argumentumok megadása a függvényekhez). Például:
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") ) )
A program futtatásakor a kimenet a következő lesz:
Keresztnév = Joe életkor = 25 ember2 példányos keresztnév = Jack életkor = 0 személy3 példányos keresztnév = Ismeretlen életkor = 0
Kotlin másodépítő
Kotlinban egy osztály tartalmazhat egy vagy több másodlagos konstruktort is. constructor
Kulcsszóval jönnek létre .
A másodlagos kivitelezők nem annyira elterjedtek Kotlinban. A másodlagos konstruktor leggyakoribb használata akkor merül fel, ha olyan osztályt kell kibővíteni, amely több konstruktort biztosít, amelyek különböző módon inicializálják az osztályt. Mielőtt megtanulja, feltétlenül ellenőrizze a Kotlin örökséget.
Így hozhat létre másodlagos konstruktort Kotlinban:
class Log (konstruktor (adatok: String) (// valamilyen kód) konstruktor (adatok: String, numberOfData: Int) (// néhány kód))
Itt az Log
osztálynak két másodlagos konstruktora van, de elsődleges konstruktora nincs.
Hosszabbíthatja az osztályt:
class Log (konstruktor (adatok: String) (// kód) konstruktor (adatok: String, numberOfData: Int) (// kód)) class AuthLog: Napló (konstruktor (adatok: String): szuper (adatok) (// kód ) konstruktor (adatok: String, numberOfData: Int): szuper (data, numberOfData) (// kód))
Itt a származtatott osztály AuthLog
konstruktorai hívják az alaposztály megfelelő konstruktorát Log
. Erre super()
használják.
Kotlinban ugyanezen osztály másik konstruktorától (például a Java-ból) is hívhatunk konstruktort this()
.
class AuthLog: Napló (konstruktor (adatok: String): ez (adatok, 10) (// kód) konstruktor (adatok: String, numberOfData: Int): szuper (adatok, numberOfData) (// kód))
Példa: Kotlin másodlagos kivitelező
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) ( ) )
A program futtatásakor a kimenet a következő lesz:
Az AuthLogból -> Rossz jelszó: 10-szer
Megjegyzés: A másodlagos konstruktornak inicializálnia kell az alaposztályt, vagy át kell ruháznia egy másik konstruktorra (mint a fenti példában), ha az osztálynak nincs elsődleges konstruktora.