Sobes.tech
Middle

У чему се састоји особеност делегата својстава?

sobes.tech АИ

Одговор од АИ

Delegati svojstava u Kotlin-u omogućavaju prebacivanje logike za dobijanje i postavljanje vrednosti svojstva na zasebnu pomoćnu klasu nazvanu delegat.

Karakteristike:

  1. Razumevanje getValue i setValue: Za svojstva dostupna za čitanje (val), delegat mora imati metodu getValue. Za svojstva dostupna za čitanje i pisanje (var), delegat mora imati i getValue i setValue. Ove metode primaju kao parametre:

    • Referencu na objekat koji sadrži svojstvo (za članove klase).
    • Metapodatke svojstva u obliku objekta KProperty.
  2. Standardni delegati: Kotlin dolazi sa nizom standardnih delegata:

    • lazy: Za odloženu inicijalizaciju svojstva.
    • observable: Za izvršavanje određene radnje pri promeni vrednosti svojstva.
    • vetoable: Za izvršavanje radnje pri promeni vrednosti svojstva sa mogućnošću otkazivanja promene.
    • Delegati za mape: Svojstvo može biti sačuvano u Map.
  3. Slobodni delegati: Možete kreirati sopstvene klase delegata. Klasa mora implementirati interfejse ReadOnlyProperty (za val) ili ReadWriteProperty (za var).

Primer korišćenja lazy:

// Polje se inicijalizuje samo pri prvom pristupu
val lazyValue: String by lazy { 
    println("Računam vrednost")
    "Hello"
}

Primer korišćenja observable:

import kotlin.properties.Delegates

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

Primer prilagođenog delegata:

import kotlin.reflect.KProperty

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

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, vrednost svojstva '${property.name}' promenjena u '$value'")
    }
}

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