Kotlin
Gedelegeerde eigenschappen
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
}
}