Sobes.tech
Middle

Milline on omadusdelegeerijate eripära?

sobes.tech AI

Vastus AI-lt

Kotlin-iga omaduste delegaadid võimaldavad loogika omaduse saamise ja määramise üle viia eraldi abiklassile, mida nimetatakse delegaat.

Omaduste omadused:

  1. getValue ja setValue mõistmine: Loetavate omaduste (val) jaoks peab delegaat omama getValue meetodit. Loetavate ja kirjutatavate omaduste (var) jaoks peab delegaat omama nii getValue, kui ka setValue. Need meetodid võtavad parameetritena:

    • viite objekti, mis sisaldab omadust (klassi liikmed).
    • KProperty objekti metaandmed.
  2. Standarddelegaadid: Kotlin pakub mitmeid standarddelegaatide tüüpe:

    • lazy: omaduse hilinenud initsialiseerimine.
    • observable: tegevus, mis toimub omaduse väärtuse muutmisel.
    • vetoable: tegevus omaduse väärtuse muutmisel koos võimalusega muudatus tühistada.
    • Map-delegaadid: omadus võib olla salvestatud Map-i.
  3. Oma delegaadid: Võite luua ka oma klasside delegaate. Klass peab rakendama ReadOnlyProperty (val) või ReadWriteProperty (var) liideseid.

lazy näide:

// Väli initsialiseerub ainult esimese juurdepääsu ajal
val lazyValue: String by lazy { 
    println("Väärtuse arvutamine")
    "Hello"
}

observable näide:

import kotlin.properties.Delegates

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

Kasutaja loodud delegaat:

import kotlin.reflect.KProperty

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

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, omaduse '${property.name}' väärtus muudetud — '$value'")
    }
}

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