kotlin data class和普通class区别

使用限制
先说data class 使用上的限制

data class必须要有带参数的构造方法
Data class must have at least one primary constructor parameter

2. data class 不能被继承

Modifier ‘data’ is incompatible with ‘open’


实现区别
普通class

class VisibilityChangeRecord(val position: Int)
1
转成java

public final class VisibilityChangeRecord {
   private final int position;

   public final int getPosition() {
      return this.position;
   }

   public VisibilityChangeRecord(int position) {
      this.position = position;
   }
}



data class

data class VisibilityChangeRecord(val position: Int)


转成java

public final class VisibilityChangeRecord {
   private final int position;

   public final int getPosition() {
      return this.position;
   }

   public VisibilityChangeRecord(int position) {
      this.position = position;
   }

   public final int component1() {
      return this.position;
   }

   @NotNull
   public final VisibilityChangeRecord copy(int position) {
      return new VisibilityChangeRecord(position);
   }

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

      return var0.copy(var1);
   }

   @NotNull
   public String toString() {
      return "VisibilityChangeRecord(position=" + this.position + ")";
   }

   public int hashCode() {
      return Integer.hashCode(this.position);
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof VisibilityChangeRecord) {
            VisibilityChangeRecord var2 = (VisibilityChangeRecord)var1;
            if (this.position == var2.position) {
               return true;
            }
         }

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


两相对比,data class比class 多实现了 toString()、hashCode()、equals()、copy()、componentN()方法。
hashCode()、equals()是用来比较对象内容是否相同,多用于HashMap等容器中;
toString()是用来打印对象内容;
copy()实现了复制功能;
componentN()提供了快速访问元素的功能。
从上面看data class的功能 class都能实现,data class只是是kotlin提供的具有常用数据model功能的类,用于提升开发效率。

一点拓展
data class 可以有普通变量吗?答案是可以,那普通变量和元素变量有何区别呢?看下面的例子:

data class VisibilityChangeRecord(val position: Int) {
    var id = 0L
}


转成java

public final class VisibilityChangeRecord {
   private long id;
   private final int position;

   public final long getId() {
      return this.id;
   }

   public final void setId(long var1) {
      this.id = var1;
   }

   public final int getPosition() {
      return this.position;
   }

   public VisibilityChangeRecord(int position) {
      this.position = position;
   }

   public final int component1() {
      return this.position;
   }

   @NotNull
   public final VisibilityChangeRecord copy(int position) {
      return new VisibilityChangeRecord(position);
   }

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

      return var0.copy(var1);
   }

   @NotNull
   public String toString() {
      return "VisibilityChangeRecord(position=" + this.position + ")";
   }

   public int hashCode() {
      return Integer.hashCode(this.position);
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof VisibilityChangeRecord) {
            VisibilityChangeRecord var2 = (VisibilityChangeRecord)var1;
            if (this.position == var2.position) {
               return true;
            }
         }

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


发现data class 中的普通变量和普通class 的普通变量是相同的含义:不参与到equals、hashCode、copy、toString、componentN中。
 

猜你喜欢

转载自blog.csdn.net/liujun3512159/article/details/128843445