V tomto článku se pomocí příkladů dozvíte o konstruktorech v Kotlin (primární i sekundární konstruktory) i o inicializačních blocích.
Konstruktor je stručný způsob inicializace vlastností třídy.
Jedná se o speciální členskou funkci, která se volá při vytvoření instance objektu (vytvoření). Jak však pracují v Kotlinu, se mírně liší.
V Kotlinu existují dva konstruktory:
- Primární konstruktor - stručný způsob inicializace třídy
- Sekundární konstruktor - umožňuje vložit další inicializační logiku
Primární konstruktér
Primární konstruktor je součástí záhlaví třídy. Zde je příklad:
osoba třídy (val firstName: String, var age: Int) (// tělo třídy)
Blok kódu obklopen závorkách je primární konstruktor: (val firstName: String, var age: Int)
.
Konstruktor deklaroval dvě vlastnosti: firstName
( vlastnost jen pro čtení, protože je deklarována pomocí klíčového slova val
) a age
(vlastnost pro čtení a zápis, jak je deklarována pomocí klíčového slova var
).
Příklad: Primární 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) ( )
Když spustíte program, výstup bude:
Jméno = Joe Věk = 25
Když Person
je vytvořen objekt třídy "Joe"
a 25
hodnoty jsou předány, jako by Person
to byla funkce.
Tento inicializuje firstName
a age
vlastnosti člověka1 námitky proti "Joe"
a 25
v tomto pořadí.
Existují i jiné způsoby použití primárních konstruktorů.
Bloky primárního konstruktoru a inicializátoru
Primární konstruktor má omezenou syntaxi a nemůže obsahovat žádný kód.
K vložení inicializačního kódu (nejen kódu pro inicializaci vlastností) se používá inicializační blok. Má předponu init
klíčové slovo. Pojďme upravit výše uvedený příklad s inicializačním blokem:
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") ) )
Když spustíte program, výstup bude:
First Name = Joe Age = 25
Zde parametry fname a osobnost uvnitř závorek přijímá hodnoty "Joe"
a 25
v tomto pořadí, pokud je vytvořen PERSON1 objektu. FName a personAge se však používají bez použití var
nebo val
a nejsou vlastnostmi Person
třídy.
Person
Třída má dvě vlastnosti křestní jméno, věk a jsou deklarovány.
Když je person1
objekt vytvořen, provede se kód uvnitř bloku inicializátoru. Inicializační blok nejen inicializuje své vlastnosti, ale také je vytiskne.
Tady je další způsob provedení stejného úkolu:
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") ) )
K rozlišení parametru a vlastnosti konstruktoru se používají různé názvy (fName a firstName a personAge a age). Je běžnější používat _firstName a _age místo úplně jiného názvu pro parametry konstruktoru. Například:
třída Osoba (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // inicializační blok init (…))
Výchozí hodnota v primárním konstruktoru
Parametry konstruktoru můžete poskytnout výchozí hodnotu (podobně jako poskytnutí výchozích argumentů funkcím). Například:
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") ) )
Když spustíte program, výstup bude:
Křestní jméno = Joe Věk = 25 osob2 je instancováno Křestní jméno = Jack Věk = 0 osob3 je instancováno Křestní jméno = NEZNÁMÝ Věk = 0
Kotlin sekundární konstruktér
V Kotlin může třída také obsahovat jeden nebo více sekundárních konstruktorů. Jsou vytvořeny pomocí constructor
klíčového slova.
Sekundární konstruktéři nejsou v Kotlinu tak běžní. Nejběžnější použití sekundárního konstruktoru se objeví, když potřebujete rozšířit třídu, která poskytuje více konstruktorů, které inicializují třídu různými způsoby. Než se to naučíte, nezapomeňte zkontrolovat Kotlin Inheritance.
Tady je postup, jak v Kotlinu vytvořit sekundární konstruktor:
třída Log (konstruktor (data: String) (// nějaký kód) konstruktor (data: String, numberOfData: Int) (// nějaký kód))
Tady má Log
třída dva sekundární konstruktory, ale žádný primární konstruktor.
Třídu můžete rozšířit jako:
třída Log (konstruktor (data: String) (// kód) konstruktor (data: String, numberOfData: Int) (// kód)) třída AuthLog: Log (konstruktor (data: String): super (data) (// kód ) konstruktor (data: String, numberOfData: Int): super (data, numberOfData) (// kód))
Tady konstruktory odvozené třídy AuthLog
volá odpovídající konstruktor základní třídy Log
. K tomu super()
se používá.
V Kotlin můžete také volat konstruktor z jiného konstruktoru stejné třídy (jako v Javě) pomocí this()
.
třída AuthLog: Log (konstruktor (data: String): tento (data, 10) (// kód) konstruktor (data: String, numberOfData: Int): super (data, numberOfData) (// kód))
Příklad: Kotlin Secondary Constructor
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) ( ) )
Když spustíte program, výstup bude:
From AuthLog -> Bad Password: 10 times
Poznámka: Sekundární konstruktor musí inicializovat základní třídu nebo delegovat na jiný konstruktor (jako ve výše uvedeném příkladu), pokud třída nemá primární konstruktor.