Je l' ai utilisé fonctionnalité autogénérés de plug - in android pour le studio android et il m'a généré le code suivant, mais je ne comprends pas pourquoi il est nécessaire final val
pour le CREATOR
terrain? Je vois le final
mot - clé pour la première fois dans kotlin.
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)
}
}
}
}
Dans Kotlin, les classes et les membres sont définitifs par défaut . En d'autres termes, les déclarations suivantes ont le même bytecode:
@JvmField final val CREATOR: Parcelable.Creator<Person> = PersonCreator()
@JvmField val CREATOR: Parcelable.Creator<Person> = PersonCreator()
Ainsi, bien que le code généré ait un final
mot-clé et que ce ne soit pas une erreur, il est redondant.
Même si les classes et les membres sont définitifs par défaut, il existe toujours un besoin de final
modificateur dans Kotlin. Un exemple serait de marquer la open
méthode comme final
dans une classe dérivée:
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
}
Bien que ce soit une bonne pratique de créer un public static
champ final
en Java, il n'y a aucune exigence stricte pour que le Parccelable.Creator
champ soit marqué comme tel:
Les classes implémentant l'interface Parcelable doivent également avoir un champ statique non nul appelé CREATOR d'un type qui implémente l'interface Parcelable.Creator.
Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.
En cas d'infraction, veuillez [email protected] Supprimer.
laisse moi dire quelques mots