Kotlin细节十三:data class 的优点 与局限

data class 限制

    data class 不能是 open 的,也就是没法被其他类继承 data class 不能是抽象的 data class 不能是 内部类

data class 自动生成的代码是什么样的

data class man(val name:String,val age:Int){
          
   

}

反编译后可以看到 自动生成了

    get set hashcode equals 带参数的构造函数
public final class Man {
          
   
   @NotNull
   private final String name;
   private final int age;

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

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

   public Man(@NotNull String name, int age) {
          
   
      Intrinsics.checkParameterIsNotNull(name, "name");
      super();
      this.name = name;
      this.age = age;
   }

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

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

   @NotNull
   public final Man copy(@NotNull String name, int age) {
          
   
      Intrinsics.checkParameterIsNotNull(name, "name");
      return new Man(name, age);
   }

   // $FF: synthetic method
   public static Man copy$default(Man var0, String var1, int var2, int var3, Object var4) {
          
   
      if ((var3 & 1) != 0) {
          
   
         var1 = var0.name;
      }

      if ((var3 & 2) != 0) {
          
   
         var2 = var0.age;
      }

      return var0.copy(var1, var2);
   }

   @NotNull
   public String toString() {
          
   
      return "Man(name=" + this.name + ", age=" + this.age + ")";
   }

   public int hashCode() {
          
   
      String var10000 = this.name;
      return (var10000 != null ? var10000.hashCode() : 0) * 31 + this.age;
   }

   public boolean equals(@Nullable Object var1) {
          
   
      if (this != var1) {
          
   
         if (var1 instanceof Man) {
          
   
            Man var2 = (Man)var1;
            if (Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
          
   
               return true;
            }
         }

         return false;
      } else {
          
   
         return true;
      }
   }
}

date class 的局限

    没有无参构造函数。对某些框架可能不友好 。 生成的 hash 和 equals 函数可能不是我们需要的 ,比如在使用HashMap 和HashSet的时候,我们希望用 地址来判断 而不是 属性

https://www.dazhuanlan.com/2019/12/12/5df134df6cec3/

经验分享 程序员 微信小程序 职场和发展