2016-05-22 9 views
5

मैंने एंड्रॉइड स्टूडियो के लिए एंड्रॉइड प्लगइन की ऑटो जेनरेटेड फीचर का उपयोग किया है और यह मुझे निम्नलिखित कोड जेनरेट करता है, लेकिन मुझे समझ में नहीं आता है कि CREATOR फ़ील्ड के लिए final val क्यों है? मैं kotlin में पहली बार final कीवर्ड दिखाई देता।कोटलिन एंड्रॉइड पार्ससेलबल

data class Person(
     val name: String, 
     val surname: String 
) : Parcelable { 
    constructor(source: Parcel): this(source.readString(), source.readString()) 

    override fun describeContents(): Int { 
     return 0 
    } 

    override fun writeToParcel(dest: Parcel?, flags: Int) { 
     dest?.writeString(name) 
     dest?.writeString(surname) 
    } 

    companion object { 
     @JvmField final val CREATOR: Parcelable.Creator<Person> = object : Parcelable.Creator<Person> { 
      override fun createFromParcel(source: Parcel): Person { 
       return Person(source) 
      } 

      override fun newArray(size: Int): Array<Person?> { 
       return arrayOfNulls(size) 
      } 
     } 
    } 
} 

उत्तर

4

कोटलिन classes and members are final by default में। दूसरे शब्दों में निम्नलिखित घोषणाओं ही बाईटकोड है:

@JvmField final val CREATOR: Parcelable.Creator<Person> = PersonCreator() 
@JvmField val CREATOR: Parcelable.Creator<Person> = PersonCreator() 

इसलिए जब उत्पन्न कोड final कीवर्ड है और यह एक त्रुटि यह अनावश्यक है नहीं है।

हालांकि वर्गों और सदस्यों वहाँ अभी भी Kotlin में final संशोधक के लिए एक की जरूरत नहीं है डिफ़ॉल्ट रूप से अंतिम होते हैं। एक उदाहरण व्युत्पन्न वर्ग में final रूप open विधि चिह्नित करने के लिए होगा:

open class Base { 
    open fun test(){} 
} 

open class DerivedA : Base(){ 
    final override fun test(){} 
} 

class DerivedB : DerivedA() { 
    override fun test(){} //error: 'test' in 'DerivedA' is final and cannot be overriden 
} 

हालांकि यह जावा में public static क्षेत्र final बनाने के लिए एक अच्छा अभ्यास है वहाँ no strict requirement for the Parccelable.Creator field इस तरह के रूप में चिह्नित किया जाना चाहिए:

को लागू करने कक्षाएं Parcelable इंटरफ़ेस का भी में गैर-शून्य स्थिर एक प्रकार है कि Parcelable.Creator इंटरफ़ेस लागू करता है के निर्माता कहा जाता है क्षेत्र होना आवश्यक है।