我已经为android使用了自动生成的android插件功能,它为我生成了以下代码,但是我不明白为什么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)
}
}
}
}
发布于 2016-05-22 09:31:15
在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
字段final
是一个很好的实践,但是字段将被标记为这样:
实现Parcelable接口的类还必须具有一个非空静态字段,称为实现Parcelable.Creator接口的类型的创建者。
发布于 2019-05-03 12:21:29
在Kotlin中,您可以使用@Parcelize
Kotlin Android扩展:
@Parcelize
data class User(val id: String, val name: String) : Parcelable
这是一个编译器插件,自动为您生成Parcelable实现。
Kotlin文档上的此页提供了更多关于它的详细信息,包括需求、支撑类型以及如何为不受支持的类型创建定制包。
如果您很好奇,并且想深入了解实现的技术细节,请参阅Kotlin演化和增强过程。
这个特性是实验直到Kotlin 1.3.40。如果您仍在使用1.3.40之前的Kotlin版本,则需要启用以下实验特性:
android {
// Enable @Parcelize
// You only need this for Kotlin < 1.3.40
androidExtensions {
experimental = true
}
...
}
发布于 2020-03-11 10:42:33
对数据类使用@Parcelize注释并扩展Parcelable。科特林会自动替你做剩下的事。个人数据类。
@Parcelize
data class Person(val name: String, val age: Int, val email: String) : Parcelable
您可以发送值,让按下按钮点击下面的活动。
private val PERSON = "person"
// first ensure a person object with data
val person = Person("Shihab Uddin", 30, "shihab.mi7@gmai.com")
binding.buttonSend.setOnClickListener {
val intent = Intent(this, ReceiveParcelableAcitivty::class.java)
//then put an parcelable extra to intent
intent.putExtra(PERSON, person)
startActivity(intent)
}
接收者活动将获得如下的数据
private val PERSON = "person"
intent?.let {
var person = intent.extras.getParcelable(PERSON) as Person
bind.textViewData.text = " Data Receive: $person"
}
androidExtensions属性不再是必需的< kotlin 1.3.40
android {
// You only need this for Kotlin < 1.3.40
androidExtensions {
experimental = true
}
...
}
https://stackoverflow.com/questions/37372435
复制相似问题