Sobes.tech
Middle

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:

  1. Begrip van getValue en setValue: Voor eigenschappen die leesbaar zijn (val), moet de delegaat een getValue-methode hebben. Voor eigenschappen die zowel lees- als schrijfbaar zijn (var), moet de delegaat zowel getValue als setValue hebben. 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.
  2. 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.
  3. Willekeurige delegaten: Je kunt je eigen delegaatklassen maken. De klasse moet de interfaces ReadOnlyProperty (voor val) of ReadWriteProperty (voor var) 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()
}