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

Kotlin podmienky if a if else

V tomto článku sa naučíš, čo je to podmienka a ako ju požiť. Poďme na to a poďme sa naučiť Kotlin podmienky if a if else. Základom každého algoritmu je podmienka. Ak niečo, tak niečo, alebo niečo iné. Napríklad ideš kúpiť vajíčka do obchodu: Je obchod otvorený? Ak...

Kotlin porovnávanie, rozdiel medzi == a ===

V tomto článku sa oboznámiš ako je to v Kotline s porovnávaním. Dozvieš sa aký je rozdiel medzi == a ===. Poďme na to v článku Kotlin porovnávanie, rozdiel medzi == a ===. V Jave ak by som porovnal dve premenné pomocou ==, tak sa porovná ich hodnota. V Kotline je...

Kotlin premenné

V tomto článku sa dozvieš čo sú to premenné a ako fungujú v programovacom jazyku Kotlin. Premenné sú jedným zo základných pilierov pri programovaní. Musíš vedieť, ako sa vytvárajú a na čo slúžia. Poďme na to Kotlin premenné. Premenné slúžia na uchovanie informácii...

Kotlin prvý program

V tomto článku sa dozvieš ako krok za krokom napíšeš svoj prvý program v Kotline. Potrebuješ vývojové prostredie IntelliJ IDEA a ostatné sa dozvieš v článku. Vytvoríme nový Kotlin/JVM project a dáme Next. Pomenujeme projekt a zašpecifikujeme umiestnenie....

Ako skonvertovať Java kód na Kotlin kód

V IntelliJ IDEA máme možnosť skopírovať java kód a po vložení do Kotlin kódu sa nás IDEA spýta, či daný kód chceme preložiť do Kotlin kódu. Toto je rýchli spôsob ako si vyskúšať ako by Java kód vyzeral v Kotline. A ty sa v tomto článku dozvieš ako na...

Kotlin úvod v skratke

V tomto článku sa ti v skratke budem snažiť povedať, čo je to Kotlin. Kotlin je programovací jazyk, ktorý vlastní JetBrains, ktorý vytvorili napríklad IntelliJ IDEA vývojové prostredie. Kotlin je navrhnutý tak, aby mohol byť spustený na JVM, tak ako iné java programy....

Kotlin plugin v IntelliJ IDEA

Pri programovaní aplikácie - programu v jazyku Kotlin vieme použiť napríklad IntelliJ IDEA vývojové prostredie. Ja toto prostredie odporúčam a v tomto článku sa dozvieš ako nastaviť Kotlin plugin v IntelliJ IDEA. V IntelliJ IDEA si musíme byť istý, že máme...

Share This

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