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:
-
getValueirsetValuesupratimas: Skaitomoms ypatybėms (val) delegatas turi turėtigetValuemetodą. Skaitomoms ir rašomoms ypatybėms (var) delegatas turi turėti irgetValue, irsetValue. Šie metodai priima kaip parametrus:- nuorodą į objektą, kuriame yra ypatybė (klasės nariai).
KPropertyobjekto metaduomenis.
-
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
Mapobjekte.
-
Savarankiški delegatai: Galima kurti savo delegato klases. Klasė turi įgyvendinti
ReadOnlyProperty(val) arbaReadWriteProperty(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()
}