2016-05-22 21 views
5

Ich habe automatisch generierte Funktion von Android-Plugin für Android Studio verwendet und es generierte mir den folgenden Code, aber ich kann nicht verstehen, warum gibt es final val für CREATOR Feld? Ich sehe final Stichwort zum ersten Mal in Kotlin.Kotlin android parcelable

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

Antwort

4

In Kotlin classes and members are final by default. Mit anderen Worten haben die folgenden Erklärungen den gleichen Bytecode:

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

So, während die erzeugte Code final Schlüsselwort hat, und es ist kein Fehler, es ist überflüssig.

Obwohl Klassen und Mitglieder standardmäßig final sind, gibt es in Kotlin immer noch einen final Modifikator. Ein Beispiel wäre open Methode als final in abgeleiteten Klasse markieren:

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 
} 

Während es eine gute Praxis ist public static Feld final in Java zu machen gibt es no strict requirement for the Parccelable.Creator field als solche gekennzeichnet werden:

Klassen der Umsetzung Parcelable Schnittstelle muss auch ein nicht-Null statisches Feld namens CREATOR eines Typs, der die Parcelable.Creator-Schnittstelle implementiert.