こんにちは。ピクトリンク事業部の古川です。
今回はKotlinの便利機能である @Parcelize アノテーションについて解説します。
公式ドキュメントはこちらです。
ちなみにこの内容は、2018/08/25に行われたKotlin Fest 2018のセッション(start from Convert to Kotlin by 望月美帆さん)によって少し解説されたものです。
Parcelable とは
Parcelableは、例えばAndroidだとActivity間のデータ通信の際、一時的にデータを保存したい場合に利用します。
Kotlinでは、 バージョン1.1.4からExperimentalとして追加されました。
使い方
利用するにはkotlin-android-extensionsが必要ですので、build.gradleに追加しましょう。
また、Experimentalですので、その情報も追加します。
apply plugin: 'kotlin-android-extensions' androidExtensions { experimental = true }
このアノテーションを利用しなかった場合は次のようになります。
data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable { override fun describeContents(): Int = 0 override fun writeToParcel(dest: Parcel, flags: Int) { dest.writeString(firstName) dest.writeString(lastName) dest.writeInt(age) } }
このクラスに次のように @Parcelize アノテーションを追加すると、とてもシンプルになります。
@Parcelize data class User(val firstName: String, val lastName: String, val age: Int): Parcelable
関数すら無くなりました。
もちろん、何か独自のロジックを入れたい場合は追加することも可能です。
@Parcelize data class User(val firstName: String, val lastName: String, val age: Int) : Parcelable { private companion object : Parceler<User> { override fun User.write(parcel: Parcel, flags: Int) { // Custom write implementation } override fun create(parcel: Parcel): User { // Custom read implementation } } }
ちなみに
このUser.ktクラスをKotlinでなくJavaで書くと、次のようになります。
public class User implements Parcelable { String lastName; String firstName; int age; public User(String lastName, String firstName, int age) { this.lastName = lastName; this.firstName = firstName; this.age = age; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int i) { dest.writeString(lastName); dest.writeString(firstName); dest.writeInt(age); } protected User(Parcel in) { lastName = in.readString(); firstName = in.readString(); age = in.readInt(); } public static final Creator<User> CREATOR = new Creator<User>() { @Override public User createFromParcel(Parcel in) { return new User(in); } @Override public User[] newArray(int size) { return new User[size]; } }; }
Javaだと膨大な量ですが、Kotlinだとたったの1行で完結しました!
Kotlin最高!
Kotlinかわいい!