Sobes.tech
Junior

Čo sú rozšírenia v jazyku Kotlin?

sobes.tech AI

Odpoveď od AI

Rozšírenia v Kotlin umožňujú pridávať nové funkcie alebo vlastnosti k existujúcim triedam bez dedičnosti alebo použitia dekorátora.

Hlavné koncepty:

  • Rozšírené funkcie (Extension Functions): Pridávajú nové metódy k triedam.

    // Definícia rozšírenej funkcie
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Použitie rozšírenej funkcie
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString bude "HelloWorld"
    

    Kľúčové slovo this vnútri rozšírenej funkcie odkazuje na objekt, na ktorý sa rozšírenie volá (v príklade vyššie na myString).

  • Vlastnosti rozšírenia (Extension Properties): Umožňujú pridávať nové vlastnosti k triedam, ale nemôžu mať stav, teda nemôžu ukladať dáta. Sú vypočítavané pri každom prístupe.

    // Definícia vlastnosti rozšírenia
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Použitie vlastnosti rozšírenia
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast bude 2
    

    Vlastnosti rozšírenia musia mať getter. Setter je voliteľný.

Špeciálne vlastnosti:

  • Statická dispatch: Volanie rozšírenia je určené typom premennej, nie typom objektu počas behu. To sa líši od virtuálnych metód v objektovo-orientovanom programovaní.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // Vypíše "Parent", pretože typ premennej 'p' je Parent
    
  • Súkromné a protected členy: Rozšírenia nemôžu pristupovať k súkromným alebo protected členom triedy, ktorú rozširujú.

  • Rozšírenia pre companion object: Môžu rozširovať objekty-kompány tried.

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Companion")
    
    MyClass.printName() // Vypíše "MyClass Companion"
    
  • Oblasť viditeľnosti (Visibility): Rozšírenia musia byť deklarované v súbore a následne importované na použitie v iných súboroch.

Rozšírenia sú mocný nástroj na tvorbu čitateľného a flexibilného kódu, umožňujú pridávať funkcionalitu k triedam z externých knižníc bez zmeny ich zdrojového kódu.