Zoeken…


Invoering

Kotlin kan de implementatie van een eigenschap delegeren aan een handlerobject. Sommige standaard handlers zijn inbegrepen, zoals luie initialisatie of waarneembare eigenschappen. Aangepaste handlers kunnen ook worden gemaakt.

Luie initialisatie

val foo : Int by lazy { 1 + 1 }
println(foo)

Het voorbeeld wordt afgedrukt 2 .

Waarneembare eigenschappen

var foo : Int by Delegates.observable("1") { property, oldValue, newValue ->
    println("${property.name} was changed from $oldValue to $newValue")
}
foo = 2

Het voorbeeld afdrukken foo was changed from 1 to 2

Eigenschappen op de kaart

val map = mapOf("foo" to 1)
val foo : String by map
println(foo)

Het voorbeeld drukt 1

Aangepaste delegatie

class MyDelegate {
    operator fun getValue(owner: Any?, property: KProperty<*>): String {
        return "Delegated value"
    }
}

val foo : String by MyDelegate()
println(foo)

In het voorbeeld wordt Delegated value afgedrukt

Delegeren Kan worden gebruikt als een laag om boilerplate te verminderen

Overweeg het Null Type-systeem van Kotlin en WeakReference<T> .

Dus laten we zeggen dat we een soort referentie moeten opslaan en we wilden geheugenlekken voorkomen, hier komt WeakReference binnen.

neem bijvoorbeeld dit:

class MyMemoryExpensiveClass {
    companion object {
        var reference: WeakReference<MyMemoryExpensiveClass>? = null

        fun doWithReference(block: (MyMemoryExpensiveClass) -> Unit) {
            reference?.let {
                it.get()?.let(block)
            }
        }
    }

    init {
        reference = WeakReference(this)
    }
}

Nu is dit slechts met één WeakReference. Om deze boilerplate te verkleinen, kunnen we een aangepaste afgevaardigde gebruiken om ons zo te helpen:

class WeakReferenceDelegate<T>(initialValue: T? = null) : ReadWriteProperty<Any, T?> {
    var reference = WeakReference(initialValue)
        private set
    
    override fun getValue(thisRef: Any, property: KProperty<*>): T? = reference.get()
    
    override fun setValue(thisRef: Any, property: KProperty<*>, value: T?) {
        reference = WeakReference(value)
    }
}

Dus nu kunnen we variabelen gebruiken die zijn ingepakt met WeakReference net als normale nulbare variabelen!

class MyMemoryExpensiveClass {
    companion object {
        var reference: MyMemoryExpensiveClass? by WeakReferenceDelegate<MyMemoryExpensiveClass>()

        fun doWithReference(block: (MyMemoryExpensiveClass) -> Unit) {
            reference?.let(block)
        }
    }

    init {
        reference = this
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow