2016-05-22 11 views
5

Użyłem funkcji automatycznego generowania wtyczki dla Androida dla Androida i wygenerował mi następujący kod, ale nie rozumiem, dlaczego jest potrzebne final val dla pola CREATOR? Słowo kluczowe final widzę po raz pierwszy w kotlinach.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) 
      } 
     } 
    } 
} 

Odpowiedz

4

In Kotlin classes and members are final by default. Innymi słowy następujące deklaracje mają ten sam kod bajtowy:

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

Więc podczas gdy generowany kod ma final słowa kluczowego i nie jest błędem jest zbędne.

Mimo że zajęcia i członkowie są domyślnie ostateczne, nadal istnieje potrzeba modyfikatora final w Kotlin. Jednym z przykładów byłoby oznaczyć open sposobu jak final w klasie pochodnej:

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 
} 

Choć jest to dobra praktyka, aby public static pole final w Javie istnieje no strict requirement for the Parccelable.Creator field być oznaczone jako takie:

Klasy wykonawczego Interfejs paczkowy musi również mieć niezerowe, statyczne pole o nazwie CREATOR, które implementuje interfejs Parcelable.Creator .

Powiązane problemy