Select Page

Kotlin triedy a konštruktory

Jaroslav Beňo

23/05/2020

Trieda slúži na opis a výrobu objektov. Skúsme porozmýšľať nad reálnym objektom – napríklad auto. Ak chceme opísať auto do programu, tak na opis auta použijeme triedu.

Čo má auto? Aké vlastnosti? Má počet dverí, značku, ečv, objem kufra a ďalších xy vecí. Nie všetky budeme používať.

Vytvorme si triedu Auto.

class Auto {
   
}

Na základe tejto triedy si vytvoríme nový objekt typu Auto.

val auticko = Auto()

Na výrobu objektov budeme používať konštruktor. Konštruktor ako názov naznačuje slúži na skonštruovanie nového objektu.

Bez toho aby si ty sám napísal nejaký konštruktor, tak máš jeden dostupný automaticky. Tento sa volá – bezparametrický konštruktor – je to akoby metóda, ktorá na vstupe nemá parametre. Preto je možné vyrobiť nový objekt pomocou Auto()

Vytvorme si ale konštruktor, ktorý vytvorí Auto s názvom. Vedľa názvu triedy napíšeme constructor zátvorky a do zátvoriek dáme premennú a typ.

class Auto constructor(nazov: String) {

}  

Teraz vieme zavolať vytvorenie auta pomocou nového konštruktoru:

val auticko = Auto("Skoda")

Všimni si, že pôvodný bez parametrický konštruktor nemáme dostupný. Teraz nedokážem vytvoriť nové auto pomocou Autu(), pretože tento konštruktor bol doplnený len ak som nezadal žiaden iný konštruktor. Ak ale predsa len chceme bez parametrický konštruktor musíme ho doplniť.

Teraz sme do zavolania konštruktoru poslali String Skoda. Kde sa ale tento String uloží? To musíme špecifikovať.

Tu je rozdiel od vytvorenie Osoby, ako sme to robili pred tým. Vytvoríme si teda premennú v triede s názvom a typom. Táto premenná je globálna v triede. Je dostupná všetkým metódam v danej triede. Ale ak je globálna musí mať hodnotu, lebo hocikde v nejakej metóde k nej môžeme pristúpiť.

class Auto constructor(nazov: String) {
    val nazov: String
}

Akú hodnotu tam chcem dať? Tú hodnotu, ktorá prišla do konštruktoru. Túto hodnotu viem využiť v bloku kódu init.

class Auto constructor(nazov: String) {
    val nazov: String
   
    init {
        this.nazov = nazov
    }
} 

Takto napísaný konštruktor mimo kučeravých zátvoriek triedy sa nazýva privátny konštruktor. K tomu si niečo ešte povieme.

Ak používame primárny konštruktor a chceme využiť nazov, ktorý mi prišiel do konštoru, tak na to využijmee init blok, ktorý sa volá iba raz pri vytvorení objektu.

Tu vo vnútri sa cez príkaz this odvolávame na tento novo vytvorený objekt a tomuto novému objektu nastavujem nazov hodnotou, ktorú som poslal do konštruktoru pod názvom nazov.

Ak by sa premenná v konštruktore volal inak, tak nemusím volať this.

class Auto constructor(nazov2: String) {
    val nazov: String

    init {
        nazov = nazov2
    }
}

Tento spôsob je zdĺhavý a pracuje podobne ako v jave.

Kratší spôsob je odstránenie init bloku a pridanie hodnoty priamo z konštruktoru do globálnej premennej.

class Auto constructor(nazov2: String) {
    val nazov: String = nazov2
}

Načo je konštruktor – na presunutie hodnoty do globálnej premennej. Stále opakujem toto jednoduché. Preto to v Kotline vieme ešte viac uľahčiť.

Zmažeme globálnu premennú (property) a do konštruktoru pridáme pre nazov2 val a meno zmeníme na nazov. Teraz Kotlin na pozadí vytvorí property a nastaví mu hodnotu, nám stačí napísať:

class Auto constructor(val nazov: String) {
}

Teraz to vieme ešte viac zjednodušiť, tým, že odstránime slovo constructor:

class Auto (val nazov: String) {
}

Týmto spôsobom sme vytvorili jeden primárny konštruktor.

Často sa ale stáva, že chceme objekt vytvoriť a podstrčiť mu rôzne premenné, napríklad názov a počet dverí. Vieme vytvoriť ďalší konštruktor:

class Auto (val nazov: String) {

    constructor(nazov: String, pocetDveri: Int){

    }

} 

Tento konštruktor požaduje, aby sa zavolal primárny konštruktor, ak sme ho zadefinovali.  Tento primárny konštruktor zavoláme ak za zátvorkou dáme dvojbodku a napíšeme this(nazov). Čo sa stalo? This sa odvolá na konštruktor, ktorý má presne jeden String parameter. Zavolá sa primárny konštrukor a posunie sa do neho premenná nazov z tohto sekundárneho konštruktoru.

class Auto (val nazov: String) {

    constructor(nazov: String, pocetDveri: Int) : this(nazov){
       
    }
} 

Tu si treba  zapamätať, že sekundárne konštruktory nám na pozadí nenastavia hodnoty na globálne premenné. Teda nazov sa posunie do primárneho konštruktoru a tam sa nastaví na property nazov a môžem urobiť nad objektom auto.nazov. Ale pocetDveri sa neposúva do primárneho konštruktoru a teda pocetDveri nie je dostupný ako auto.pocetDveri.

Musíme vytvoriť vlastnú property v triede (globálnu premennú).

class Auto (val nazov: String) {

    val pocetDveri: Int
   
    constructor(val nazov: String, val pocetDveri: Int){

    }
}

PocetDveri nesmie byť ne-inicializovaný – musíme mu pridať hodnotu a to spravíme pomocou pridania hodnoty na priamo alebo v init bloku.

class Auto (val nazov: String) {

    var pocetDveri: Int = 4

    constructor(nazov: String, pocetDveri: Int) : this(nazov){
       
    }
}

Ak hodnota príde v sekundárnom konštruktore, tak ju nastavíme na property:

class Auto (val nazov: String) {

    var pocetDveri: Int = 4

    constructor(nazov: String, pocetDveri: Int) : this(nazov){
        this.pocetDveri = pocetDveri
    }
} 

Teraz vieme auto vytvoriť pomocou oboch konštruktorov.

val auticko = Auto("Skoda")
val skoda = Auto("Skoda", 5)
println(skoda.nazov)
println(skoda.pocetDveri)

Je možné dosiahnúť to, aby som vytvoril objekt dvomi spôsobmi bez toho aby som musel napísať nový sekundárny konštruktor. Teda môžem spraviť toto pomocou jedného konštruktoru?:

val auticko = Auto("Skoda")
val skoda = Auto("Skoda", 5)

Odpoveď je áno a to tak, že všetky property napíšeme v primárnom konštruktore ale hodnotám, ktoré sa nemusia vždy vyplniť dáme default hodnotu.

Triedu Auto prerobíme takto:

class Auto (val nazov: String, val pocetDveri: Int = 4) {

}

Aj sekundárne konštruktory môžu obsahovať default hodnoty.

Ak v triede neexistuje primárny konštruktor, tak môžeme vytvoriť sekundárny konštruktor a nemusíme pomocou dvojbodky volať nič.

class Skuska{
    val daco: Int;
   
    constructor(){
        this.daco = 4;
    }
}

IDEA nám dáva ponuku prerobiť to na primárny konštruktor:

class Skuska() {
    val daco: Int;

    init {
        this.daco = 4
    }
}

Najnovšie články

O autorovi: Jaroslav Beňo

Jaro je v skratke kresťan, manžel, otec a programátor. Na tomto webe sa venuje programovaniu. Jeho túžbou je šíriť vedomosti ďalej, aby sme mohli spolu rásť.

Pripravil viacero online video kurzov. Jeho sociálne siete:

Podobné články

Naprogramuj si vlastnú Android aplikáciu v jazyku Kotlin

V tvojej prvej Android aplikácii v Kotlime si spravíme aplikáciu na hod kockou. Stalo sa ti, že si hral človeče a chýbala ti kocka? Teraz ti postačí tvoja android appka. Verím, že telefón budeš mať po ruke skôr ako kocku :). Tlačidlo Layout vieme písať aj ručne....

Kotlin extension functions

Predstav si, že chceš manipulovať so stringom. Máš text, ktorý chceš upraviť, napríklad každé druhé písmeno chceš dať veľkým písmenom. Každé prvé bude malým. Máš takúto metódu v Stringu? Nie. Teda nie je možné zavolať napríklad: "Lorem ipsum dolor sit amet,...

Kotlin funkcie

Ak je funkcia vo vnútri triedy, tak sa označuje ako metóda alebo member funkcia – ale je to v podstate jedno. Začíname so slovom fun. Potom ide názov a nasledujú argumenty. Ak metóda nič nevracia, tak na pozadí vracia typ Unit. Ak metóda vracia nejakú...

Kotlin Data class

Ak potrebuješ uchovávať stav aplikácie. Teda máš premenné a potrebuješ ich nastavovať a získavať ich hodnoty, tak vieš použiť Data class. Máme triedu Auto: class Auto (val nazov: String, val pocetDveri: Int = 4) { } Ako z nej spravím data class?...

Kotlin range

Range ako názov hovorí je rozpätie hodnôt. V tomto článku sa pozrieme na to ako Kotlin pracuje s range. Poďme sa pozrieť na príklady. Použitie v podmienke: if (i in 1..4) { // equivalent of 1 <= i && i <= 4 print(i) } Prechádzanie cez hodnoty rangu:...

Kotlin dátové typy

Java a Kotlin sú zameniteľné jazyky. Vieš ich obidva použiť v jednom programe, pretože nakoniec z nich bude .class súbor. Tým pádom typy, ktoré pozná Kotlin, pozná aj Java. Sú rozdiely, ktoré už vieš. Nevieš napísať typ int, ale vieš ho používať...

Kotlin String templates

Pri vypisovaní textu často ku textu pridávame hodnoty z premenných. Spájanie Stringov vieme spraviť pomocou + kde pospájame hodnoty a Stringy: for((i, v) in mena.withIndex()){ print("" + i + " " + v + "\n") } Kotlin ale má krajšiu cestu: for((i, v) in...

Kotlin for cyklus

Cyklus alebo loop znamená, že niečo sa opakuje xy krát. Možno prechádzame čísla od 1 do 100, alebo prechádzame cez elementy v poli alebo liste. V tomto článku sa dozvieš ako použiť for cyklus. Predstav si, že chceš vypísať čísla od 0 do 10. Použijeme for cyklus...

Kotlin polia

Pole je zoskupenie jeden a viac prvkov. Na vytvorenie poľa použijeme funkciu arrayOf. Do pola môžeme dať hodnoty rôzneho typu. val mena = arrayOf("Jaro", "Peter"); val rozne = arrayOf("Jaro", 10, Osoba("Tomas", "145878/8787"), false, "Peter"); Aj miešame typy...

Kotlin when

Predstav si, že napíšeš aplikáciu, kde používateľ bude čítať dáta z konzoly, ak niečo zadá, tak sa má niečo vykonať, ak zadá niečo iné, tak sa vykoná niečo iné. Napríklad budeš mať aplikáciu, kde používateľ bude vyberať smer kade má ísť. Ak napíše SEVER, tak na...

Share This

Páčil sa ti článok? Zváž zdieľanie. Ďakujeme.