2016-06-19 23 views
25

जावा में, उदाहरण के लिए, मैं अपने आप पर गेटर्स लिख सकता हूं (आईडीई द्वारा उत्पन्न) या लोम्बोक में @ गीटर जैसे एनोटेशन का उपयोग करें - जो कि बहुत आसान था।कोटलिन में गेटर्स और सेटर्स

कोटलिन हालांकि getters and setters by default है। लेकिन मैं समझ नहीं पा रहा हूं कि उनका उपयोग कैसे करें।

मैं इसे बनाना चाहते, मान लीजिए कि - जावा के समान:

private val isEmpty: String 
     get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility. 

तो टिककर खेल काम करते हैं?

उत्तर

45

गेटर्स और सेटर्स कोटलिन में स्वतः उत्पन्न होते हैं। यदि आप लिखना:

val isEmpty: Boolean 

यह निम्न जावा कोड के बराबर है:

private final Boolean isEmpty; 

public Boolean isEmpty() { 
    return isEmpty; 
} 

आपके मामले में निजी उपयोग संशोधक निरर्थक है - isEmpty डिफ़ॉल्ट रूप से निजी है और एक गेटर से केवल पहुँचा जा सकता है । जब आप अपनी ऑब्जेक्ट की कोशिश करने की कोशिश करते हैं तो संपत्ति संपत्ति आप वास्तविक तरीके से विधि प्राप्त करते हैं। नीचे दिए गए दो कोड नमूने के बराबर हैं: - यह है

var someProperty: String = "defaultValue" 

और

var someProperty: String = "defaultValue" 
    get() = field 
    set(value) { field = value } 

इसके अलावा, मैं कहना चाहता हूँ कि एक गेटर में this अपनी संपत्ति नहीं है Kotlin में getters/setters की अधिक समझ के लिए वर्ग उदाहरण। यदि आप एक गेटर में फ़ील्ड का मान के लिए उपयोग करना चाहते हैं या सेटर से आपको उसके लिए आरक्षित शब्द field उपयोग कर सकते हैं:

val isEmpty: Boolean 
    get() = field 

आप केवल सार्वजनिक उपयोग में प्राप्त विधि करना चाहते हैं - तो आप इस कोड लिख सकते हैं :

var isEmpty: Boolean 
    private set 

निजी संशोधक सेट एक्सेसर पास आप केवल अपने ऑब्जेक्ट के अंदर तरीकों में यह मान सेट कर सकते हैं की वजह से।

+5

'आपके मामले में निजी उपयोग संशोधक कैसे redundant' है? कोटलिन डॉक्टर का कहना है कि डिफ़ॉल्ट संशोधक सार्वजनिक है। https://kotlinlang.org/docs/reference/visibility-modifiers.html –

+0

@Nothing हाँ यह सार्वजनिक क्षेत्र की तरह लगता है, लेकिन हुड के नीचे आप गेटर विधि कॉल – Cortwave

+0

'वैल isEmpty: Boolean' isEmpty के रूप में संकलित नहीं होगा अभी तक नहीं है शुरू किया, है ना? बसलिन सीखना शुरू कर दिया। साथ ही, 'get() = field' के साथ क्या हो रहा है? –

12

संपत्ति के बारे में नियम पहुंचकर्ता visibility modifiers निम्नलिखित हैं:

  • var और val संपत्ति का मनुष्य दृश्यता बिल्कुल ही संपत्ति की दृश्यता को होना चाहिए, इस प्रकार आप केवल स्पष्ट रूप से संपत्ति नकल कर सकते हैं संशोधक, लेकिन यह अनावश्यक है: var गुण की

    protected val x: Int 
        protected get() = 0 // No need in `protected` here. 
    
  • सेटर दृश्यता y होना चाहिए एक ही या उससे कम अनुमोदक संपत्ति दृश्यता की तुलना में:

    protected var x: Int 
        get() = 0 
        private set(x: Int) { } // Only `private` and `protected` are allowed. 
    

Kotlin में, गुण हमेशा गेटर और सेटर से पहुंचा जाता है, इस प्रकार वहाँ public accessors तरह के साथ एक संपत्ति private बनाने में कोई आवश्यकता नहीं है जावा में - its backing field (if present) पहले से ही निजी है।

  • समर्थन क्षेत्र और डिफ़ॉल्ट accessors के साथ एक संपत्ति के लिए:: समर्थन क्षेत्र के बिना

    var x = 0 // `public` by default 
        private set 
    
  • एक संपत्ति के लिए: तो, संपत्ति accessors पर दृश्यता संशोधक केवल सेटर दृश्यता कम अनुमोदक बनाने के लिए उपयोग किया जाता है

    kotlin में
    var x: Int // `public` by default 
        get() = 0 
        protected set(value: Int) { } 
    
4

मनुष्य डिफ़ॉल्ट जनता के द्वारा है, लेकिन आप सेट कर सकते हैं एक वर्ग के अंदर एक विधि का उपयोग करके निजी करने के लिए सेटर और मूल्य निर्धारित करें। इस प्रकार सं.

/** 
* Created by leo on 17/06/17.*/ 

package foo 
class Person() { 
var name: String = "defaultValue" 
       private set 

fun foo(bar: String) { 
    name = bar // name can be set here 
     } 
} 

fun main(args: Array<String>) { 
    var p = Person() 
    println("Name of the person is ${p.name}") 
    p.foo("Jhon Doe") 
    println("Name of the person is ${p.name}") 
} 
3

आप अधिक जानकारी के लिए इस ट्यूटोरियल देख सकते हैं:

Yet Another Kotlin Tutorial for Android Developers

गुण

Kotlin दुनिया में, कक्षाओं क्षेत्रों, बस गुण नहीं हो सकता। var कीवर्ड हमें बताता है कि संपत्ति मूल्यवान है, वैल के विपरीत। चलो एक उदाहरण देखें:

class Contact(var number: String) { 

    var firstName: String? = null 
    var lastName: String? = null 
    private val hasPrefix : Boolean 
     get() = number.startsWith("+") 

} 

और भी बहुत कुछ कोड नहीं है, लेकिन चीजों के बहुत सारे पर्दे के पीछे हो रही हैं। हम इसके माध्यम से कदम से कदम उठाएंगे। सबसे पहले, हमने सार्वजनिक अंतिम श्रेणी संपर्क बनाया।

यह प्राथमिक नियम हम सामना करना पड़ता है है: अगर अन्यथा निर्दिष्ट नहीं, कक्षाएं सार्वजनिक और डिफ़ॉल्ट रूप से अंतिम होते हैं (वैसे, एक ही वर्ग तरीकों के लिए है)। यदि आप कक्षा से उत्तराधिकारी बनाना चाहते हैं, तो इसे कीवर्ड के साथ चिह्नित करें।

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