Konstruktory a inicializátory Kotlin (s příklady)

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ž Personje vytvořen objekt třídy "Joe"a 25hodnoty jsou předány, jako by Personto byla funkce.

Tento inicializuje firstNamea agevlastnosti člověka1 námitky proti "Joe"a 25v 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 initklíč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 25v tomto pořadí, pokud je vytvořen PERSON1 objektu. FName a personAge se však používají bez použití varnebo vala nejsou vlastnostmi Persontřídy.

PersonTřída má dvě vlastnosti křestní jméno, věk a jsou deklarovány.

Když je person1objekt 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í constructorklíč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á Logtří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 AuthLogvolá 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.

Zajímavé články...