Sobes.tech
Middle

Kuo išsiskiria savybių delegatai?

sobes.tech AI

Atsakymas iš AI

Kotlin ypatybių delegatai leidžia perkelti ypatybės gavimo ir nustatymo logiką į atskirą pagalbinį klasę, vadinamą delegatu.

Ypatybių ypatybės:

  1. getValue ir setValue supratimas: Skaitomoms ypatybėms (val) delegatas turi turėti getValue metodą. Skaitomoms ir rašomoms ypatybėms (var) delegatas turi turėti ir getValue, ir setValue. Šie metodai priima kaip parametrus:

    • nuorodą į objektą, kuriame yra ypatybė (klasės nariai).
    • KProperty objekto metaduomenis.
  2. Standartiniai delegatai: Kotlin tiekiamas su keliomis standartinėmis delegatų rūšimis:

    • lazy: vėlinė ypatybės inicializacija.
    • observable: veiksmas, atliekamas keičiant ypatybės reikšmę.
    • vetoable: veiksmas keičiant ypatybės reikšmę su galimybe atmesti pakeitimą.
    • Map delegatai: ypatybė gali būti saugoma Map objekte.
  3. Savarankiški delegatai: Galima kurti savo delegato klases. Klasė turi įgyvendinti ReadOnlyProperty (val) arba ReadWriteProperty (var) sąsajas.

lazy pavyzdys:

// Laukas inicijuojamas tik pirmojo pasiekimo metu
val lazyValue: String by lazy { 
    println("Skaičiuoju reikšmę")
    "Hello"
}

observable pavyzdys:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<nenurodytas>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Naudotojo sukurtas delegatas:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, ypatybės '${property.name}' reikšmė"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, ypatybės '${property.name}' reikšmė pakeista į '$value'")
    }
}

class Example {
    var p: String by Delegate()
}