こんにちは。ピクトリンク事業部の古川です。
今回は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かわいい!