Sobes.tech
Middle

Na czym polega cecha delegatów właściwości?

sobes.tech AI

Odpowiedź od AI

Delegaty właściwości w Kotlinie pozwalają na przeniesienie logiki pobierania i ustawiania wartości właściwości do osobnej klasy pomocniczej zwanej delegatem.

Cechy:

  1. Zrozumienie getValue i setValue: Dla właściwości dostępnych do odczytu (val) delegat musi mieć metodę getValue. Dla właściwości dostępnych do odczytu i zapisu (var) delegat musi mieć zarówno getValue, jak i setValue. Metody te przyjmują jako parametry:

    • Referencję do obiektu zawierającego właściwość (dla członków klasy).
    • Metadane właściwości w postaci obiektu KProperty.
  2. Standardowe delegaty: Kotlin dostarcza szereg standardowych delegatów:

    • lazy: do opóźnionej inicjalizacji właściwości.
    • observable: do wykonywania określonej akcji przy zmianie wartości właściwości.
    • vetoable: do wykonywania akcji przy zmianie wartości właściwości z możliwością jej anulowania.
    • Delegaty dla map: Właściwość może być przechowywana w Map.
  3. Dowolne delegaty: Można tworzyć własne klasy delegatów. Klasa musi implementować interfejsy ReadOnlyProperty (dla val) lub ReadWriteProperty (dla var).

Przykład użycia lazy:

// Pole jest inicjalizowane tylko przy pierwszym dostępie
val lazyValue: String by lazy { 
    println("Obliczam wartość")
    "Hello"
}

Przykład użycia observable:

import kotlin.properties.Delegates

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

Przykład własnego delegata:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, wartość właściwości '${property.name}'"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, wartość właściwości '${property.name}' została zmieniona na '$value'")
    }
}

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