kotlin data class和普通class区别

使用限制

先说data class 使用上的限制

  1. 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)

转成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中。

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值