定義如下:與普通類對比學習
//普通類
class NormalClass(val name: String, val age: Int, val sex: Char)
//數據類
data class DataClass(val name: String, val age: Int, val sex: Char)
對應找到java反編譯的代碼路徑:Tool-->Kotlin-->Show Kotlin Bytecode-->Decompile-->DataClass.decompiled.java下關鍵代碼如下:
public final class NormalClass {@NotNullprivate final String name;private final int age;private final char sex;@NotNullpublic final String getName() {return this.name;}public final int getAge() {return this.age;}public final char getSex() {return this.sex;}public NormalClass(@NotNull String name, int age, char sex) {Intrinsics.checkNotNullParameter(name, "name");super();this.name = name;this.age = age;this.sex = sex;}
}
public final class DataClass {@NotNullprivate final String name;private final int age;private final char sex;@NotNullpublic final String getName() {return this.name;}public final int getAge() {return this.age;}public final char getSex() {return this.sex;}public DataClass(@NotNull String name, int age, char sex) {Intrinsics.checkNotNullParameter(name, "name");super();this.name = name;this.age = age;this.sex = sex;}@NotNullpublic final String component1() {return this.name;}public final int component2() {return this.age;}public final char component3() {return this.sex;}@NotNullpublic final DataClass copy(@NotNull String name, int age, char sex) {Intrinsics.checkNotNullParameter(name, "name");return new DataClass(name, age, sex);}// $FF: synthetic methodpublic static DataClass copy$default(DataClass var0, String var1, int var2, char var3, int var4, Object var5) {if ((var4 & 1) != 0) {var1 = var0.name;}if ((var4 & 2) != 0) {var2 = var0.age;}if ((var4 & 4) != 0) {var3 = var0.sex;}return var0.copy(var1, var2, var3);}@NotNullpublic String toString() {return "DataClass(name=" + this.name + ", age=" + this.age + ", sex=" + this.sex + ")";}public int hashCode() {String var10000 = this.name;return ((var10000 != null ? var10000.hashCode() : 0) * 31 + Integer.hashCode(this.age)) * 31 + Character.hashCode(this.sex);}public boolean equals(@Nullable Object var1) {if (this != var1) {if (var1 instanceof DataClass) {DataClass var2 = (DataClass)var1;if (Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age && this.sex == var2.sex) {return true;}}return false;} else {return true;}}
}
對比可知:
普通類:set get 構造
數據類:set get 構造 copy toString hashCode equals? 解構操作component(0..參數個數)個方法
//普通類
class NormalClass(val name: String, val age: Int, val sex: Char)//數據類
data class DataClass(val name: String, val age: Int, val sex: Char)fun main() {val normal1 = NormalClass("張三", 10, '男')val normal2 = NormalClass("張三", 10, '男')val data1 = DataClass("張三", 10, '男')val data2 = DataClass("張三", 10, '男')println("normal1 : $normal1")println("data1 : $data1")println("normal1==normal2: ${normal1 == normal2}")println("normal1.equals(normal2): ${normal1.equals(normal2)}")//equals <==> ==println("data1==data2: ${data1 == data2}")println("data1.equals(data2): ${data1.equals(data2)}") //equals <==> ==
}
結果如下:
注意:copy toString hashCode equals? 解構操作等只管主構造,不管次構造。
? ? ? ? ? 也就是說調用次構造函數的時候不要妄圖使用上面這些重寫的方法,toStirng方法除外。
數據類的使用條件:
條件一:服務器請求回來的響應的 JavaBean LoginResponseBean 基本上可以使用 數據類? ? ? ? 條件二:數據類至少必須有一個參數的主構造函數
條件三:數據類必須有參數, var val 的參數
條件四:數據類不能使用 abstract,open,sealed,inner 等等 修飾 (數據類,數據載入的事情 數據存儲)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 條件五:需要??比較,copy,tostring,解構,等等 這些豐富的功能時,也可以使用數據類