Middle
V čom spočíva vlastnosť delegátov vlastností?
sobes.tech AI
Odpoveď od AI
Delegáty vlastností v Kotlin umožňujú presunúť logiku získavania a nastavovania hodnoty vlastnosti na samostatnú pomocnú triedu nazývanú delegát.
Charakteristiky:
-
Porozumenie
getValueasetValue: Pre vlastnosti dostupné na čítanie (val) musí delegát mať metódugetValue. Pre vlastnosti dostupné na čítanie a zápis (var) musí delegát mať obegetValueasetValue. Tieto metódy prijímajú ako parametre:- Referenciu na objekt obsahujúci vlastnosť (pre členov triedy).
- Metadata vlastnosti vo forme objektu
KProperty.
-
Štandardné delegáty: Kotlin prichádza s radom štandardných delegátov:
lazy: Pre oneskorenú inicializáciu vlastnosti.observable: Pre vykonanie určitej akcie pri zmene hodnoty vlastnosti.vetoable: Pre vykonanie akcie pri zmene hodnoty vlastnosti s možnosťou zrušiť zmenu.- Delegáty pre mapy: Vlastnosť môže byť uložená v
Map.
-
Libovolné delegáty: Môžete vytvárať vlastné triedy delegátov. Trieda musí implementovať rozhrania
ReadOnlyProperty(preval) aleboReadWriteProperty(prevar).
Príklad použitia lazy:
// Pole sa inicializuje iba pri prvom prístupe
val lazyValue: String by lazy {
println("Vypočítavam hodnotu")
"Hello"
}
Príklad použitia observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<žiadne meno>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Príklad vlastného delegáta:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, hodnota vlastnosti '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, hodnota vlastnosti '${property.name}' bola zmenená na '$value'")
}
}
class Example {
var p: String by Delegate()
}