2017-08-21 11 views
5

मैं एंड्रॉइड पर कोटलिन का परीक्षण कर रहा हूं और एक समस्या में भाग गया जहां दो चर के सेटर्स को infinte रिकर्सन में बुलाया जाता है क्योंकि वे मूल रूप से सेट होने पर एक दूसरे को बदलने की कोशिश करते हैं।कोटलिन सेटर infinte रिकर्सन

यहाँ एक नमूना कोड

class Example { 
    var a: Int = 0 
     set(value) { 
      b = a+10 
     } 

    var b:Int = 0 
     set(value) { 
      a = b-10 
     } 
} 

है और कहते हैं कि मैं उसके बाद निम्न कोड का उपयोग करें:

val example = Example() 
example.a = 10 

यह एक infinte recursions और अंततः एक stackoverflow के कारण समाप्त होता है। b के लिए सेटटर a के लिए सेटटर को कॉल करता है जो बदले में b के लिए सेटटर को कॉल करता है। और यह हमेशा के लिए चला जाता है।

मैं b के लिए मान को अद्यतन जब भी a सेट किया गया है, लेकिन जब भी b सेट किया गया है भी a का मान अपडेट करने में सक्षम होना चाहता हूँ।

कोटलिन विशेषज्ञों के कोई विचार वहां से बाहर हैं? क्या मुझे इस मामले में जावा को सेटर्स की तरह बनाना होगा ताकि जब भी मैं a या b पर मान निर्दिष्ट करता हूं तो मेरा सेटर कोड कॉल नहीं किया जाता है। या क्या कुछ निफ्टी कोटलिन भलाई है जिसका मैं उपयोग कर सकता हूं?

उत्तर

5

इस उदाहरण के लिए, आप केवल गुणों में से एक की गणना कर सकते हैं, उदा।

var a: Int = 0 

var b: Int 
    get() = 10 - a 
    set(value) { a = 10 - value } 

सामान्य में, हालांकि, Kotlin अन्य संपत्तियों के समर्थन क्षेत्रों के लिए पहुँच प्रदान नहीं करता। आपको इसे मैन्युअल रूप से लिखना होगा, उदा।

private var _a: Int = 0 
var a: Int 
    get() = _a 
    set(value) { 
     _a = value 
     _b = 10 - value 
    } 

private var _b: Int = 10 
var b: Int 
    get() = _b 
    set(value) { 
     _b = value 
     _a = 10 - value 
    } 

कोटलिन इन गुणों के लिए अपने स्वयं के बैकिंग फ़ील्ड जेनरेट नहीं करेगा क्योंकि उनका कभी भी उपयोग नहीं किया जाता है।