Sobes.tech
Junior

Wyjaśnij użycie słowa kluczowego 'this' w języku Kotlin.

sobes.tech AI

Odpowiedź od AI

W Kotlinie this odnosi się do bieżącego egzemplarza klasy. Jego użycie zależy od kontekstu:

  1. Wewnątrz metody klasy: this odnosi się do egzemplarza, na którym wywołano metodę.

    class MyClass {
        var value: Int = 0
    
        fun setValue(value: Int) {
            // Używamy this.value do dostępu do właściwości klasy
            // i value dla parametru metody
            this.value = value 
        }
    }
    
  2. Wewnątrz funkcji lub właściwości rozszerzenia: this odnosi się do obiektu, do którego stosuje się rozszerzenie.

    fun String.printLength() {
        // this tutaj jest instancją String, na której wywołano funkcję rozszerzenia
        println("Długość łańcucha: ${this.length}") 
    }
    
    fun main() {
        "Cześć".printLength() // Wypisze "Długość łańcucha: 5"
    }
    
  3. Wewnątrz literali funkcji z odbiornikiem: this odnosi się do odbiorcy literala.

    fun buildString(builderAction: StringBuilder.() -> Unit): String {
        val sb = StringBuilder()
        // Wewnątrz builderAction, this odnosi się do sb (instancja StringBuilder)
        sb.builderAction() 
        return sb.toString()
    }
    
    val myString = buildString {
        // this tutaj jest StringBuilder
        append("Cześć, ")
        append("Świecie!")
    }
    
  4. Dla kwalifikowanego this (przy wielu odbiorcach): Używa się go do eliminacji niejednoznaczności, gdy istnieją zagnieżdżone struktury z różnymi odbiorcami (np. zagnieżdżone klasy, literale funkcji z odbiornikiem). Składnia to %label@this, gdzie %label to etykieta powiązana z kontekstem.

    class Outer {
        inner class Inner {
            fun printThis() {
                // this odnosi się do instancji Inner
                println("Inner this: ${this}") 
                // Outer@this odnosi się do instancji Outer
                println("Outer this: ${this@Outer}") 
            }
        }
    
        fun createInner() = Inner()
    }
    
    fun main() {
        Outer().createInner().printThis()
    }
    

Ogólnie, this w Kotlinie zapewnia jawny dostęp do bieżącego kontekstu, czy to instancji klasy, obiektu rozszerzenia czy odbiornika funkcji literackiej, co zwiększa czytelność i unika konfliktów nazw.