2017-04-05 11 views
36

जावा डेवलपर के रूप में, बैकिंग फ़ील्ड की अवधारणा मेरे लिए थोड़ा सा विदेशी है। दिया गया:के लिए कोटलिन बैकिंग फील्ड क्या है?

class Sample { 
     var counter = 0 // the initializer value is written directly to the backing field 
     set(value) { 
      if (value >= 0) field = value 
     } 
    } 

इस बैकिंग फ़ील्ड के लिए क्या अच्छा है? Kotlin docs ने कहा: कोटलिन में कक्षाओं में फ़ील्ड नहीं हो सकते हैं। हालांकि, कभी-कभी कस्टम एक्सेसर्स का उपयोग करते समय बैकिंग फ़ील्ड होना जरूरी है। क्यूं कर? गुणों का उपयोग करने के साथ क्या अंतर सेटटर के अंदर खुद का नाम है, उदाहरण के लिए।

class Sample {   
     var counter = 0 
     set(value) { 
      if (value >= 0) this.counter = value // or just counter = value? 
     } 
    } 
+3

निश्चित रूप से जावा डेवलपर के रूप में यह अवधारणा कुछ है जो आप दिन में दस लाख बार उपयोग करते हैं :) उन सभी 'निजी कुछ क्लास फ़ील्ड; ' – Strelok

+4

संपत्ति के उपयोग में स्वयं का उपयोग करना संपत्ति के लिए कुछ मूल्य निर्दिष्ट करने के बाद एक अंतहीन रिकर्सन होगा हमेशा सेटर कॉल करेंगे। – funglejunk

+0

@Strelok मेरा बुरा .... मैं मान रहा था कि 'k.clin = value' कोटलिन के दस्तावेज़ों को पढ़ने के दौरान जावा समकक्ष के साथ समान है। –

उत्तर

36

वजह से, कहते हैं कि अगर आप field कीवर्ड की जरूरत नहीं है, आप वास्तव में स्थापित करने के लिए/get() या set(value) में मूल्य प्राप्त नहीं कर सकेंगे। यह आपको कस्टम एक्सेसर्स में बैकिंग फ़ील्ड तक पहुंचने में सक्षम बनाता है। जाहिर है इस के रूप में सेटर में ही सिर्फ एक infinte प्रत्यावर्तन है, कुछ भी बदल रहा है कभी नहीं, अच्छा नहीं है

class Sample { 
    private int counter = 0; 
    public void setCounter(int value) { 
     if (value >= 0) setCounter(value); 
    } 
    public int getCounter() { 
     return counter; 
    } 
} 

:

यह अपने नमूना के बराबर जावा कोड है। जब भी आप foo.bar = value लिखते हैं तो कोटलिन में याद रखें इसे PUTFIELD के बजाय एक सेटर कॉल में अनुवादित किया जाएगा।


संपादित करें: Kotlin गुण जबकि जावा क्षेत्रों, जो क्षेत्रों की तुलना में एक नहीं बल्कि उच्च स्तर अवधारणा है है।

दो प्रकार के गुण हैं: एक बैकिंग फ़ील्ड वाला, बिना किसी के।

बैकिंग फ़ील्ड वाली एक संपत्ति फ़ील्ड के रूप में मान संग्रहीत करेगी। वह फ़ील्ड मेमोरी में संभव मूल्य संग्रहित करता है। ऐसी संपत्ति का एक उदाहरण first और secondPair गुणों का एक उदाहरण है। वह संपत्ति Pair के इन-मेमोरी प्रतिनिधित्व को बदल देगी।

बैकिंग फ़ील्ड के बिना एक संपत्ति को अपने मूल्य को स्मृति में सीधे संग्रहीत करने के अलावा अन्य तरीकों से स्टोर करना होगा। यह अन्य गुणों, या वस्तु से ही गणना की जानी चाहिए। ऐसी संपत्ति का एक उदाहरण indicesList की विस्तार संपत्ति है, जिसे किसी क्षेत्र द्वारा समर्थित नहीं किया गया है, लेकिन size संपत्ति के आधार पर गणना की गई एक परिणाम है। इसलिए यह List के इन-मेमोरी प्रस्तुति को नहीं बदलेगा (जो यह बिल्कुल नहीं कर सकता क्योंकि जावा स्थिर रूप से टाइप किया गया है)।

+0

उत्तर के लिए धन्यवाद! मेरा बुरा ... मैं मान रहा था कि 'this.counter = value' जावा समतुल्य के समान है। –

7

बैकिंग फ़ील्ड सत्यापन चलाने या राज्य परिवर्तन पर घटनाओं को ट्रिगर करने के लिए अच्छे हैं। उस समय के बारे में सोचें जब आपने जावा सेटर/गेटर में कोड जोड़ा है। बैकिंग फ़ील्ड समान परिदृश्यों में उपयोगी होंगे। जब आप सेटर्स/गेटर्स पर नियंत्रण या दृश्यता की आवश्यकता होती है तो आप बैकिंग फ़ील्ड्स का उपयोग करेंगे।

फ़ील्ड नाम के साथ फ़ील्ड को असाइन करते समय, आप वास्तव में सेटटर का आविष्कार कर रहे हैं (यानी set(value))। उदाहरण में आपके पास this.counter = value सेट (मूल्य) में पुन: कार्य करेगा जब तक कि हम अपने ढेर को ओवरफ़्लो नहीं करते। field का उपयोग करटर (या गेटर) कोड को बाईपास करता है।

1

प्रारंभ में, मुझे भी इस अवधारणा को समझने में कठिन समय था। इसलिए मैं आपको उदाहरण की मदद से समझाऊंगा।

इस Kotlin वर्ग

class DummyClass { 
    var size = 0; 
    var isEmpty 
     get() = size == 0 
     set(value) { 
      size = size * 2 
     } 
} 

पर विचार अब जब हम कोड को देखो, हम देख सकते हैं यह 2 गुण यानी है कि - size (डिफ़ॉल्ट accessors के साथ) और isEmpty (कस्टम accessors के साथ)। लेकिन इसमें केवल 1 फ़ील्ड है i.e size। यह समझने के लिए कि इसमें केवल 1 फ़ील्ड है, आइए हम इस कक्षा के जावा समकक्ष देखें।

टूल्स -> कोटलिन -> एंड्रॉइड स्टूडियो में कोटलिन बाइटकोड दिखाएं। Decompile पर क्लिक करें।

public final class DummyClass { 
    private int size; 

    public final int getSize() { 
     return this.size; 
    } 

    public final void setSize(int var1) { 
     this.size = var1; 
    } 

    public final boolean isEmpty() { 
     return this.size == 0; 
    } 

    public final void setEmpty(boolean value) { 
     this.size *= 2; 
    } 
} 

जाहिर है हम देख सकते हैं कि जावा वर्ग isEmpty के लिए केवल गेटर और सेटर कार्य करता है, और कोई क्षेत्र इसके लिए घोषित है। इसी तरह कोटलिन में, isEmpty संपत्ति के लिए कोई समर्थन क्षेत्र नहीं है, क्योंकि संपत्ति उस क्षेत्र पर निर्भर नहीं है। इस प्रकार कोई समर्थन क्षेत्र नहीं।


अब हम कस्टम गेटर और isEmpty संपत्ति के सेटर को दूर करते हैं।

class DummyClass { 
    var size = 0; 
    var isEmpty = false 
} 

और ऊपर वर्ग के जावा बराबर

public final class DummyClass { 
    private int size; 
    private boolean isEmpty; 

    public final int getSize() { 
     return this.size; 
    } 

    public final void setSize(int var1) { 
     this.size = var1; 
    } 

    public final boolean isEmpty() { 
     return this.isEmpty; 
    } 

    public final void setEmpty(boolean var1) { 
     this.isEmpty = var1; 
    } 
} 

यहाँ हम दोनों क्षेत्रों size और isEmpty देखते हैं। isEmpty एक बैकिंग फ़ील्ड है क्योंकि isEmpty संपत्ति के लिए गेटर और सेटर इस पर निर्भर करता है।

संबंधित मुद्दे