2016-05-22 14 views
5

私はアンドロイドのスタジオのためのAndroidのプラグインの自動生成機能を使用してきましたし、それは私に次のコードを生成しますが、CREATORフィールドのfinal valが必要とされる理由を私は理解できないのですか? kotlinでは初めてfinalというキーワードが表示されます。Kotlinアンドロイド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。生成されたコードはfinalキーワードを持っており、それが冗長でエラーではありませんしながら、だから、

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

:他の言葉で次の宣言は、同じバイトコードを持っています。

クラスとメンバーはデフォルトで最終的ですが、まだKotlinにはfinal修飾子が必要です。一例としては、派生クラスでfinalようopen方法をマークするために、次のようになります。

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 
} 

それはJavaでpublic staticフィールドfinalを作成することをお勧めしますが、このようなとしてマークされるno strict requirement for the Parccelable.Creator fieldがあります:実装

クラスは、また、Parcelableインターフェイスには、 Parcelable.Creatorインターフェイスを実装するタイプのCREATORという、null以外の静的フィールドが ある必要があります。