Middle
У чему се састоји особеност делегата својстава?
sobes.tech АИ
Одговор од АИ
Delegati svojstava u Kotlin-u omogućavaju prebacivanje logike za dobijanje i postavljanje vrednosti svojstva na zasebnu pomoćnu klasu nazvanu delegat.
Karakteristike:
-
Razumevanje
getValueisetValue: Za svojstva dostupna za čitanje (val), delegat mora imati metodugetValue. Za svojstva dostupna za čitanje i pisanje (var), delegat mora imati igetValueisetValue. Ove metode primaju kao parametre:- Referencu na objekat koji sadrži svojstvo (za članove klase).
- Metapodatke svojstva u obliku objekta
KProperty.
-
Standardni delegati: Kotlin dolazi sa nizom standardnih delegata:
lazy: Za odloženu inicijalizaciju svojstva.observable: Za izvršavanje određene radnje pri promeni vrednosti svojstva.vetoable: Za izvršavanje radnje pri promeni vrednosti svojstva sa mogućnošću otkazivanja promene.- Delegati za mape: Svojstvo može biti sačuvano u
Map.
-
Slobodni delegati: Možete kreirati sopstvene klase delegata. Klasa mora implementirati interfejse
ReadOnlyProperty(zaval) iliReadWriteProperty(zavar).
Primer korišćenja lazy:
// Polje se inicijalizuje samo pri prvom pristupu
val lazyValue: String by lazy {
println("Računam vrednost")
"Hello"
}
Primer korišćenja observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<nema imena>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Primer prilagođenog delegata:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, vrednost svojstva '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, vrednost svojstva '${property.name}' promenjena u '$value'")
}
}
class Example {
var p: String by Delegate()
}