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:
-
Verständnis von
getValueundsetValue: Für lesbare Eigenschaften (val) muss der Delegat eine MethodegetValuehaben. Für schreib- und lesbare Eigenschaften (var) muss der Delegat sowohlgetValueals auchsetValuehaben. 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.
-
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
Mapgespeichert werden.
-
Beliebige Delegaten: Es können eigene Delegat-Klassen erstellt werden. Die Klasse muss die Schnittstellen
ReadOnlyProperty(fürval) oderReadWriteProperty(fürvar) 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()
}