Wat is de eigenschap van eigendomsdelegaten?
sobes.tech AI
Antwoord van AI
Eigenschappen-delegaten in Kotlin stellen je in staat om de logica voor het verkrijgen en instellen van de waarde van een eigenschap over te dragen aan een aparte hulppklasse genaamd delegaat.
Kenmerken:
-
Begrip van
getValueensetValue: Voor eigenschappen die leesbaar zijn (val), moet de delegaat eengetValue-methode hebben. Voor eigenschappen die zowel lees- als schrijfbaar zijn (var), moet de delegaat zowelgetValuealssetValuehebben. Deze methoden nemen als parameters:- Een verwijzing naar het object dat de eigenschap bevat (voor klassemleden).
- Metadata van de eigenschap in de vorm van een
KProperty-object.
-
Standaard delegaten: Kotlin wordt geleverd met een aantal standaard delegaten:
lazy: Voor uitgestelde initialisatie van de eigenschap.observable: Om een actie uit te voeren bij wijziging van de eigenschapwaarde.vetoable: Om een actie uit te voeren bij wijziging van de eigenschapwaarde, met de mogelijkheid om de wijziging te annuleren.- Delegates voor kaarten: De eigenschap kan worden opgeslagen in een
Map.
-
Willekeurige delegaten: Je kunt je eigen delegaatklassen maken. De klasse moet de interfaces
ReadOnlyProperty(voorval) ofReadWriteProperty(voorvar) implementeren.
Voorbeeld van gebruik van lazy:
// Het veld wordt alleen bij de eerste toegang geïnitialiseerd
val lazyValue: String by lazy {
println("Waarde berekenen")
"Hello"
}
Voorbeeld van gebruik van observable:
import kotlin.properties.Delegates
var name: String by Delegates.observable("<geen naam>") {
property, oldValue, newValue ->
println("$oldValue -> $newValue")
}
Voorbeeld van een aangepaste delegaat:
import kotlin.reflect.KProperty
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, eigenschapswaarde '${property.name}'"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$thisRef, eigenschapswaarde '${property.name}' is gewijzigd naar '$value'")
}
}
class Example {
var p: String by Delegate()
}