Sobes.tech
Junior

Mis on laiendused Kotlin programmeerimiskeeles?

sobes.tech AI

Vastus AI-lt

Kotlin laiendused võimaldavad lisada uusi funktsioone või omadusi olemasolevatele klassidele ilma pärimiseta või dekoratori kasutamiseta.

Põhikonseptsioonid:

  • Laienduste funktsioonid (Extension Functions): Lisavad uusi meetodeid klassidele.

    // Laienduse funktsiooni defineerimine
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Laienduse funktsiooni kasutamine
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString on "HelloWorld"
    

    Sõna this laienduse funktsiooni sees viitab objekti, millele laiendus rakendub (antud näites myString).

  • Laienduste omadused (Extension Properties): Annab võimaluse lisada uusi omadusi klassidele, kuid ei saa omada olekut, st. andmeid salvestada:

    // Laienduse omaduse defineerimine
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Kasutamine
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast on 2
    

    Laienduse omadustel peab olema getter, setter on valikuline.

Omadused:

  • Statiline dispetcherimine: Laienduse väljakutse määratakse muutuja tüübi järgi, mitte objekti käivitamise ajal. See erineb virtuaalsetest meetoditest objekti-orienteeritud programmeerimises.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // Kuvab "Parent", sest `p` tüüp on Parent
    
  • Privaatsed ja kaitstud liikmed: Laiendused ei saa ligi pääseda klassi privaatsetele või kaitstud liikmetele, mida nad laiendavad.

  • Kompaniiooni objekti laiendused: Võimalik laiendada klassi kompanii objekti:

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass kompanii")
    
    MyClass.printName() // Kuvab "MyClass kompanii"
    
  • Nähtavuse ulatus (Visibility): Laiendused peavad olema deklareeritud failis ja importima neid teiste failide kasutamiseks.

Laiendused on võimas tööriist loetava ja paindliku koodi loomiseks, võimaldades lisada funktsionaalsust klassidele väljastpoolt, ilma nende algset koodi muutmata.