Care este caracteristica delegaților de proprietăți?
sobes.tech AI
Răspuns de la AI
Delegarea proprietăților în Kotlin permite transferul logicii de obținere și setare a valorii unei proprietăți către o clasă auxiliară numită delegat.
Caracteristici:
-
Înțelegerea
getValueșisetValue: Pentru proprietățile accesibile pentru citire (val), delegatul trebuie să aibă o metodăgetValue. Pentru proprietățile accesibile pentru citire și scriere (var), delegatul trebuie să aibă atâtgetValue, cât șisetValue. Aceste metode primesc ca parametri:- O referință la obiectul care conține proprietatea (pentru membrii clasei).
- Metadatele proprietății sub forma unui obiect
KProperty.
-
Delegati standard: Kotlin vine cu o serie de delegați standard:
lazy: Pentru inițializarea întârziată a proprietății.observable: Pentru a executa o acțiune la schimbarea valorii proprietății.vetoable: Pentru a executa o acțiune la schimbarea valorii proprietății, cu posibilitatea de a anula schimbarea.- Delegatori pentru hărți: Proprietatea poate fi stocată într-un
Map.
-
Delegatori arbitrar: Se pot crea propriile clase delegat. Clasa trebuie să implementeze interfețele
ReadOnlyProperty(pentruval) sauReadWriteProperty(pentruvar).
Exemplu de utilizare a lazy:
// Câmpul este inițializat doar la prima accesare
val lazyValue: String by lazy {
println("Calculând valoarea")
"Hello"
}
Exemplu de utilizare a observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<fără nume>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Exemplu de delegat personalizat:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, valoarea proprietății '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, valoarea proprietății '${property.name}' a fost schimbată în '$value'")
}
}
class Example {
var p: String by Delegate()
}