Sobes.tech
Middle

Was ist die Besonderheit von Eigenschaftsdelegaten?

sobes.tech KI

Antwort von AI

Eigenschaften-Delegates in Kotlin ermöglichen es, die Logik zum Abrufen und Setzen des Werts einer Eigenschaft an eine separate Hilfsklasse namens Delegat zu übertragen.

Eigenschaften:

  1. Verständnis von getValue und setValue: Für lesbare Eigenschaften (val) muss der Delegat eine Methode getValue haben. Für schreib- und lesbare Eigenschaften (var) muss der Delegat sowohl getValue als auch setValue haben. Diese Methoden nehmen als Parameter:

    • Eine Referenz auf das Objekt, das die Eigenschaft enthält (für Klassenmitglieder).
    • Metadaten der Eigenschaft in Form eines KProperty-Objekts.
  2. Standard-Delegaten: Kotlin wird mit einer Reihe von Standard-Delegaten geliefert:

    • lazy: Für verzögerte Initialisierung der Eigenschaft.
    • observable: Für das Ausführen einer Aktion bei Änderung des Eigenschaftswerts.
    • vetoable: Für das Ausführen einer Aktion bei Änderung des Eigenschaftswerts, mit der Möglichkeit, die Änderung zu widerrufen.
    • Delegates für Maps: Die Eigenschaft kann in einer Map gespeichert werden.
  3. Beliebige Delegaten: Es können eigene Delegat-Klassen erstellt werden. Die Klasse muss die Schnittstellen ReadOnlyProperty (für val) oder ReadWriteProperty (für var) implementieren.

Beispiel für die Verwendung von lazy:

// Das Feld wird nur beim ersten Zugriff initialisiert
val lazyValue: String by lazy { 
    println("Wert wird berechnet")
    "Hello"
}

Beispiel für die Verwendung von observable:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<kein Name>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Beispiel für einen benutzerdefinierten Delegaten:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, Wert der Eigenschaft '${property.name}'"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, Wert der Eigenschaft '${property.name}' wurde auf '$value' geändert")
    }
}

class Example {
    var p: String by Delegate()
}