खोज…


परिचय

कोटलिन एक संपत्ति के कार्यान्वयन को एक हैंडलर ऑब्जेक्ट को सौंप सकता है। कुछ मानक हैंडलर शामिल हैं, जैसे आलसी आरंभीकरण या अवलोकन गुण। कस्टम हैंडलर भी बनाए जा सकते हैं।

आलसी आरंभीकरण

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

उदाहरण 2 प्रिंट करता है।

अवलोकनीय गुण

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

उदाहरण प्रिंट्स foo was changed from 1 to 2

मानचित्र समर्थित गुण

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

उदाहरण प्रिंट 1

कस्टम प्रतिनिधिमंडल

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

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

उदाहरण में Delegated value प्रिंट होता है

डेलीगेट का उपयोग बॉयलरप्लेट को कम करने के लिए एक परत के रूप में किया जा सकता है

कोटलिन की अशक्त प्रकार प्रणाली और WeakReference<T> पर विचार करें WeakReference<T>

तो मान लें कि हमें किसी प्रकार के संदर्भ को सहेजना है और हम मेमोरी लीक से बचना चाहते हैं, यहां पर WeakReference आता है।

उदाहरण के लिए इसे लें:

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

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

    init {
        reference = WeakReference(this)
    }
}

अब यह सिर्फ एक WeakReference के साथ है। इस बॉयलरप्लेट को कम करने के लिए, हम एक कस्टम प्रॉपर्टी डेलीगेट का उपयोग कर सकते हैं ताकि हम उसकी मदद कर सकें:

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)
    }
}

तो अब हम चर के साथ लिपटे रहे हैं का उपयोग कर सकते WeakReference बस सामान्य नल चर की तरह!

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
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow