2016-11-05 13 views
8

कोटलिन अपने गेटर्स और सेटिंग्स को स्वतः उत्पन्न करता है, लेकिन मैंने उन्हें कभी नहीं देखा? साथ ही, कोटलिन में कस्टम गेटर/सेटर लिखने का सही तरीका क्या है? जब मैं कहता हूं myObj.myVar = 99 मुझे लगता है कि myVarmyObj का सार्वजनिक क्षेत्र है जो मैं सीधे एक्सेस कर रहा हूं? वास्तव में यहाँ क्या हो रहा है?कोटलिन - गेटर्स और सेटर्स को समझना

+0

की [Getters और Kotlin में Setters] (https://stackoverflow.com/questions/37906607/getters-and-setters-in-kotlin) – Bharatesh

उत्तर

16

यह कुछ स्थानों में जवाब दिया गया है, लेकिन मैंने सोचा कि मैं जावा/सी #/सी/सी से Kotlin में संक्रमण लोगों के लिए एक ठोस उदाहरण साझा करेंगे ++ और जो एक ही सवाल है कि मैंने किया था:

मुझे यह समझने में कठिनाई हो रही थी कि कोटलिन में गेटर्स और सेटर्स कैसे काम करते थे, खासकर जब उन्हें कभी स्पष्ट रूप से नहीं कहा जाता था (जैसा कि वे जावा में हैं)। इस वजह से, मैं असहज महसूस कर रहा था, क्योंकि ऐसा लगता था कि हम सीधे मैदानों के रूप में युद्धों/vals का जिक्र कर रहे थे। तो मैंने यह दिखाने के लिए थोड़ा प्रयोग किया कि यह मामला नहीं है, और वास्तव में यह एक अंतर्निहित (ऑटो-जेनरेट) या स्पष्ट गेटर/सेटर है जिसे कोटलिन में कहा जाता है जब आप एक चर/मूल्य तक पहुंचते हैं। अंतर यह है कि आप स्पष्ट रूप से डिफ़ॉल्ट गेटर/सेटर के लिए नहीं पूछते हैं।

documentation से - एक संपत्ति घोषित करने के लिए पूर्ण वाक्य रचना है:

var <propertyName>: <PropertyType> [= <property_initializer>] 
    [<getter>] 
    [<setter>] 

और मेरे उदाहरण

class modifiersEg { 

/** this will not compile unless: 
*  - we assign a default here 
*  - init it in the (or all, if multiple) constructor 
*  - insert the lateinit keyword */ 
var someNum: Int? 
var someStr0: String = "hello" 
var someStr1: String = "hello" 
    get() = field // field is actually this.someStr1, and 'this' is your class/obj instance 
    set(value) { field = value } 

// kotlin actually creates the same setters and getters for someStr0 
// as we explicitly created for someStr1 

var someStr2: String? = "inital val" 
    set(value) { field = "ignore you" } 

var someStr3: String = "inital val" 
    get() = "you'll never know what this var actually contains" 

init { 
    someNum = 0 

    println(someStr2) // should print "inital val" 

    someStr2 = "blah blah blah" 
    println(someStr2) // should print "ignore you" 

    println(someStr3) // should print "you'll never know what this var actually contains" 
} 

है मुझे आशा है कि कुछ अन्य लोगों के लिए यह सब एक साथ लाने में मदद करता है?

+0

संभावित डुप्लिकेट मुझे पता है कि यह वास्तव में शुरुआत अनुकूल नहीं है, लेकिन मैं यह भी होगा कुछ जटिल संपत्ति-संबंधित सुविधाओं, जैसे प्रतिनिधि संपत्तियों के मामले में कोटलिन बाइटकोड इंस्पेक्टर का उपयोग करने की अत्यधिक अनुशंसा करते हैं। – daemontus

+0

कुछ एसआरटी 0 प्रोप, गेटर्स और सेटर के लिए उनकी दृश्यता का दायरा क्या है? इस उदाहरण में सभी गुण सार्वजनिक हैं (डिफ़ॉल्ट)। यदि मेरे पास निजी गुण हैं तो यह विलुप्त काम होगा - कुछ ऐसा है जो मुझे जावा देव होने के लिए उपयोग किया जाता है। –

+0

मैं निजी चर के लिए 'गेटर 'और' सेटर' का उपयोग कैसे कर सकता हूं – viper

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