2016-05-22 12 views
5

Ho usato la funzione generata automaticamente del plugin Android per Android Studio e mi ha generato il seguente codice, ma non riesco a capire perché è necessario il campo final val per CREATOR? Vedo la parola chiave final per la prima volta in Kotlin.Kotlin android parcellabile

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) 
      } 
     } 
    } 
} 

risposta

4

In Kotlin classes and members are final by default. In altre parole, le seguenti dichiarazioni hanno lo stesso bytecode:

@JvmField final val CREATOR: Parcelable.Creator<Person> = PersonCreator() 
@JvmField val CREATOR: Parcelable.Creator<Person> = PersonCreator() 

Così, mentre il codice generato ha final parola chiave e non è un errore, è ridondante.

Anche se le classi e i membri sono definitivi per impostazione predefinita, è ancora necessario il modificatore final in Kotlin. Un esempio potrebbe essere quello di marcare open Metodo final nella classe derivata:

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 
} 

Mentre è una buona pratica per fare public static campo final in java c'è no strict requirement for the Parccelable.Creator field da marcare in quanto tale:

classi di attuazione del L'interfaccia Parcelable deve anche avere un campo statico non null chiamato CREATOR di un tipo che implementa l'interfaccia di Parcelable.Creator .