Kotlin学习34-data数据类1

发布于:2025-05-27 ⋅ 阅读:(38) ⋅ 点赞:(0)

定义如下:与普通类对比学习

//普通类
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 {
   @NotNull
   private final String name;
   private final int age;
   private final char sex;

   @NotNull
   public 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 {
   @NotNull
   private final String name;
   private final int age;
   private final char sex;

   @NotNull
   public 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;
   }

   @NotNull
   public final String component1() {
      return this.name;
   }

   public final int component2() {
      return this.age;
   }

   public final char component3() {
      return this.sex;
   }

   @NotNull
   public final DataClass copy(@NotNull String name, int age, char sex) {
      Intrinsics.checkNotNullParameter(name, "name");
      return new DataClass(name, age, sex);
   }

   // $FF: synthetic method
   public 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);
   }

   @NotNull
   public 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,解构,等等 这些丰富的功能时,也可以使用数据类