2016-05-22 9 views
5

Я использовал автогенерированную функцию плагина android для студии android, и он сгенерировал мне следующий код, но я не могу понять, зачем нужна final val для поля CREATOR? Я вижу final ключевое слово в первый раз в Котлине.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) 
      } 
     } 
    } 
} 

ответ

4

В Котлине classes and members are final by default. Другими словами, следующие объявления имеют один и тот же байт-код:

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

Таким образом, хотя сгенерированный код имеет final ключевое слово, и это не является ошибкой является излишним.

Несмотря на то, что классы и члены являются окончательными по умолчанию, все еще требуется модификатор 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 
} 

Хотя это хорошая практика, чтобы сделать public static поля final в Java есть no strict requirement for the Parccelable.Creator field быть помечен:

Классов реализующих Parcelable interface также должен иметь ненулевое статическое поле CREATOR типа, которое реализует интерфейс Parcelable.Creator .