代码之家  ›  专栏  ›  技术社区  ›  lannyf

对于创造者来说,什么是正确的

  •  0
  • lannyf  · 技术社区  · 8 年前

    和科特林在一起 Data 类实现 Parcelable

    似乎有两种方式来定义 CREATOR: Parcelable 在《伴侣》中:

    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)
            }
        }
    
    }
    
    }
    

    相应的java反编译代码如下

    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();
      }
    }
    

    和科特林一起去拿 List<Data> 从包裹上可以做到:

    parcel.createTypedArrayList(Data.CREATOR)
    

    在java中可能是:

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

    在科特林看来,《伴侣》中的两位创造者都很好。

    区别是什么?使用哪一个更好?

    0 回复  |  直到 8 年前