先日Kotlin1.1.4がリリースされましたが、それと同時にAndroid ExtensionsによるParcelableサポートが発表されました。
Android Extensions plugin now includes an automatic Parcelable implementation generator.
https://blog.jetbrains.com/kotlin/2017/08/kotlin-1-1-4-is-out/
まだexperimentalな機能ですが、軽く触った感すでに十分使えそうだったので使い方を軽くまとめておきます。
概要
Parcelable化したいクラスに対し、アノテーションを付与することでコンパイル時にParcelableの実装に必用なコードが生成してくれます。
v1.1.4時点で以下のアノテーションとインターフェースが提供されています
@Parcelize
@RawType
Parceler
基本的な使い方(@Parcelize
)
Parcelable
を実装したクラスに@Parcelize
を付与するだけです。それだけでParcelable
の実装に必用なコードが生成されます。
@Parcelize
class User(val name: String): Parcelable
現時点で@Parcelize
を付与できるクラスの条件は以下のとおりです
-
class
ordata class
であること -
Parcelable
を実装していること - プライマリコンストラクタ内に定義されたプロパティが
Parcel
に書き込み可能な型であること - プライマリコンストラクタ内のパラメータは全て
val
orvar
であること
以下のケースは、v1.1.4時点ではサポートされていません
-
object
クラス -
@Parcelize
を利用したクラスの継承
@RawValue
Parcelableの持つプロパティの型が、シリアライズ可能かどうか不定な場合に利用します。
例えば、以下のようなクラスではT
が不定なため警告が発生し、コンパイルが通らなくなります。
@Parcelize
class Range<T: Comparable>(lower: T, upper: T): Parcelable
このときT
に対して@RawValue
を付与することで、実質的にシリアライズ可能なインスタンスが渡されることを明示できます。
@Parcelize
class Range<T: Comparable>(lower: @RawValue T, upper: @RawValue T): Parcelable
ただし、T
の型が必ずシリアライズ可能であると保証するものではないため、不正な型のインスタンスを使えばランタイム中に例外が発生します。利用する際は注意が必用です。また、@RawValue
を付与したプロパティのシリアライズにはParcel#writeValue
が利用されるようです。(参考)
ちまみに、2017/08/30時点では、このアノテーションのプロポーザル(PR)はまだmaster
にマージされていません。
https://github.com/Kotlin/KEEP/pull/72
Parceler
独自のCREATOR
を作るためのインターフェースです。 johncarl81/parceler
とは別物。
companion object
に実装することで、CREATORの処理を一部移譲できます。
あまり使う機会はない気がするので詳細は一旦省略します。
詳しく知りたい方はKEEPを読みましょう。
感想
軽く触ってみた感じ、かなり良さそうな印象を受けました。特に@RawValue
のように、細かいユースケースをうまくサポートしているところが気に入っています。今開発しているプロダクトではjohncarl81/parceler
を使っていますが、Kotlinと組み合わせるといろいろツラいところがあり、今すぐにでも置き換えたいくらいです。