Kotlin android parcelable

我已经使用Android插件的android工作室的自动生成的功能,它生成了我下面的代码,但我不明白为什么需要为CREATOR字段的final val CREATOR ? 我在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) } } } } 

在Kotlin 类和成员默认是最终的 。 换句话说,以下声明具有相同的字节码:

 @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 static字段是一个好习惯,但Parccelable.Creator字段并没有严格的要求标记为:

实现Parcelable接口的类还必须有一个名为CREATOR的非null静态字段,该字段实现了Parcelable.Creator接口。