2016-05-22 76 views
5

我已經使用android插件的android工作室自動生成的功能,它生成了以下代碼,但我不明白爲什麼需要final valCREATOR字段?我在kotlin首次看到final關鍵字。Kotlin android parcelable

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

In Kotlin 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。一個例子是,以紀念open方法final在派生類中:

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 
} 

雖然這是一個很好的做法,使在Java中public staticfinalno strict requirement for the Parccelable.Creator field被標記爲這樣:

類實現Parcelable接口還必須具有一個名爲CREATOR的非空靜態字段,該字段實現了 Parcelable.Creator接口。