Mi a tulajdonságdelegátum sajátossága?
sobes.tech MI
Válasz az MI-től
A Kotlin tulajdonságdelegátusai lehetővé teszik a tulajdonság értékének lekérdezésének és beállításának logikájának átadását egy külön segédosztálynak, amelyet delegátumnak nevezünk.
Jellemzők:
-
getValueéssetValuemegértése: Olvasható tulajdonságok (val) esetén a delegátumnak rendelkeznie kellgetValuemetódussal. Olvasható és írható tulajdonságok (var) esetén a delegátumnak mindkettővel rendelkeznie kell. Ezek a metódusok a következő paramétereket fogadják:- Egy referencia az objektumra, amely a tulajdonságot tartalmazza (osztálytagok esetén).
- A tulajdonság metaadatai egy
KPropertyobjektum formájában.
-
Alapértelmezett delegátusok: A Kotlin számos alapértelmezett delegátust tartalmaz:
lazy: A tulajdonság késleltetett inicializálására.observable: Egy művelet végrehajtására a tulajdonság értékének változásakor.vetoable: Egy művelet végrehajtására a tulajdonság értékének változásakor, lehetőséggel a változás visszavonására.- Térképekhez tartozó delegátusok: A tulajdonság egy
Map-ben tárolható.
-
Szabadon választott delegátusok: Saját delegát osztályokat hozhatsz létre. Az osztálynak implementálnia kell a
ReadOnlyProperty(aval-hoz) vagy aReadWriteProperty(avar-hoz) interfészeket.
lazy használatának példája:
// A mező csak az első hozzáféréskor inicializálódik
val lazyValue: String by lazy {
println("Érték számítása")
"Hello"
}
observable példája:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<nincs név>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Egyéni delegát példa:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, a tulajdonság '${property.name}' értéke"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, a '${property.name}' tulajdonság értéke '$value'-re változott")
}
}
class Example {
var p: String by Delegate()
}