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接口。