Sobes.tech
Middle

Mi a tulajdonságdelegátum sajátossága?

sobes.tech MI

Válasz az MI-től

A Kotlin tulajdonságdelegátusai lehetővé teszik a tulajdonság értékének lekérdezésének és beállításának logikájának átadását egy külön segédosztálynak, amelyet delegátumnak nevezünk.

Jellemzők:

  1. getValue és setValue megértése: Olvasható tulajdonságok (val) esetén a delegátumnak rendelkeznie kell getValue metódussal. Olvasható és írható tulajdonságok (var) esetén a delegátumnak mindkettővel rendelkeznie kell. Ezek a metódusok a következő paramétereket fogadják:

    • Egy referencia az objektumra, amely a tulajdonságot tartalmazza (osztálytagok esetén).
    • A tulajdonság metaadatai egy KProperty objektum formájában.
  2. Alapértelmezett delegátusok: A Kotlin számos alapértelmezett delegátust tartalmaz:

    • lazy: A tulajdonság késleltetett inicializálására.
    • observable: Egy művelet végrehajtására a tulajdonság értékének változásakor.
    • vetoable: Egy művelet végrehajtására a tulajdonság értékének változásakor, lehetőséggel a változás visszavonására.
    • Térképekhez tartozó delegátusok: A tulajdonság egy Map-ben tárolható.
  3. Szabadon választott delegátusok: Saját delegát osztályokat hozhatsz létre. Az osztálynak implementálnia kell a ReadOnlyProperty (a val-hoz) vagy a ReadWriteProperty (a var-hoz) interfészeket.

lazy használatának példája:

// A mező csak az első hozzáféréskor inicializálódik
val lazyValue: String by lazy { 
    println("Érték számítása")
    "Hello"
}

observable példája:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<nincs név>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Egyéni delegát példa:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, a tulajdonság '${property.name}' értéke"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, a '${property.name}' tulajdonság értéke '$value'-re változott")
    }
}

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