in kotlin, what is the right one for the CREATOR in a Parcelable class

2.1k Views Asked by At

with kotlin, having a Data class implements Parcelable

seems there are two way of defining the CREATOR: Parcelable in the companion:

1.

data class Data (
    @SerializedName("id")
    val id: String?,
    @SerializedName("blob")
    val blob: String?
) : Parcelable {

... ...
companion object CREATOR : Parcelable.Creator<Data> {
    override fun createFromParcel(parcel: Parcel): Data {
        return Data(parcel)
    }

    override fun newArray(size: Int): Array<Data?> {
        return arrayOfNulls(size)
    }
}

}

2

data class Data (
    @SerializedName("id")
    val id: String?,
    @SerializedName("blob")
    val blob: String?
) : Parcelable {

... ...

companion object {

    @JvmField val CREATOR: Parcelable.Creator<Data> = object : Parcelable.Creator<Data> {
        override fun createFromParcel(parcel: Parcel): Data {
            return Data(parcel)
        }

        override fun newArray(size: Int): Array<Data?> {
            return arrayOfNulls(size)
        }
    }

}

}

the corresponding java decompiled code is

1

   @JvmField
   @NotNull
   public static final Creator CREATOR = (Creator)(new Creator() {
   @NotNull
   public Data createFromParcel(@NotNull Parcel parcel) {
     Intrinsics.checkParameterIsNotNull(parcel, "parcel");
     return new Data(parcel, (DefaultConstructorMarker)null);
  }

  // $FF: synthetic method
  // $FF: bridge method
  public Object createFromParcel(Parcel var1) {
     return this.createFromParcel(var1);
  }

  @NotNull
  public Data[] newArray(int size) {
     return new Data[size];
  }

  // $FF: synthetic method
  // $FF: bridge method
  public Object[] newArray(int var1) {
     return this.newArray(var1);
  }
});

2

  public static final Data.CREATOR CREATOR = new Data.CREATOR((DefaultConstructorMarker)null);

  public static final class CREATOR implements Creator {
  @NotNull
  public Data createFromParcel(@NotNull Parcel parcel) {
     Intrinsics.checkParameterIsNotNull(parcel, "parcel");
     return new Data(parcel);
  }

  // $FF: synthetic method
  // $FF: bridge method
  public Object createFromParcel(Parcel var1) {
     return this.createFromParcel(var1);
  }

  @NotNull
  public Data[] newArray(int size) {
     return new Data[size];
  }

  // $FF: synthetic method
  // $FF: bridge method
  public Object[] newArray(int var1) {
     return this.newArray(var1);
  }

  private CREATOR() {
  }

  // $FF: synthetic method
  public CREATOR(DefaultConstructorMarker $constructor_marker) {
     this();
  }
}

and with kotlin to get a List<Data> from parcel could be done:

parcel.createTypedArrayList(Data.CREATOR)

and in java it could be:

List list = (List)(new ArrayList());
parcel.readTypedList(list, (Creator)Data.CREATOR);

Seems in kotlin both CREATOR in the companion are fine.

What is the difference, and which is better to use?

0

There are 0 best solutions below