Kotlin ExtensionsのParcelizeアノテーションでdata classをスッキリさせる


目次

こんにちは。ピクトリンク事業部の古川です。

今回は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かわいい!