Kotlin data class浅析

Data class

js 复制代码
data class MyClass(val context : String, var x : Int = 0) {
    init {
        val a = "222"
    }
}

编译成Java文件之后,是这样的:

js 复制代码
@Metadata(
   mv = {1, 9, 0},
   k = 1,
   d1 = {"\u0000 \n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\b\n\u0002\b\u000b\n\u0002\u0010\u000b\n\u0002\b\u0004\b\u0086\b\u0018\u00002\u00020\u0001B\u0017\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\b\b\u0002\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006J\t\u0010\r\u001a\u00020\u0003HÆ\u0003J\t\u0010\u000e\u001a\u00020\u0005HÆ\u0003J\u001d\u0010\u000f\u001a\u00020\u00002\b\b\u0002\u0010\u0002\u001a\u00020\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u0005HÆ\u0001J\u0013\u0010\u0010\u001a\u00020\u00112\b\u0010\u0012\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0013\u001a\u00020\u0005HÖ\u0001J\t\u0010\u0014\u001a\u00020\u0003HÖ\u0001R\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u001a\u0010\u0004\u001a\u00020\u0005X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\t\u0010\n"\u0004\b\u000b\u0010\f¨\u0006\u0015"},
   d2 = {"Lcom/example/androidcoroutines/MyClass;", "", "context", "", "x", "", "(Ljava/lang/String;I)V", "getContext", "()Ljava/lang/String;", "getX", "()I", "setX", "(I)V", "component1", "component2", "copy", "equals", "", "other", "hashCode", "toString", "app_debug"}
)
public final class MyClass {
   @NotNull
   private final String context;
   private int x;

   @NotNull
   public final String getContext() {
      return this.context;
   }

   public final int getX() {
      return this.x;
   }

   public final void setX(int var1) {
      this.x = var1;
   }

   public MyClass(@NotNull String context, int x) {
      Intrinsics.checkNotNullParameter(context, "context");
      super();
      this.context = context;
      this.x = x;
      String var3 = "222";
   }

   // $FF: synthetic method
   public MyClass(String var1, int var2, int var3, DefaultConstructorMarker var4) {
      if ((var3 & 2) != 0) {
         var2 = 0;
      }

      this(var1, var2);
   }

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

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

   @NotNull
   public final MyClass copy(@NotNull String context, int x) {
      Intrinsics.checkNotNullParameter(context, "context");
      return new MyClass(context, x);
   }

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

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

      return var0.copy(var1, var2);
   }

   @NotNull
   public String toString() {
      return "MyClass(context=" + this.context + ", x=" + this.x + ")";
   }

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

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

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

非Data class

js 复制代码
class MyClass(val context : String, var x : Int = 0) {
    init {
        val a = "222"
    }
}

编译成Java文件之后:

js 复制代码
@Metadata(
   mv = {1, 9, 0},
   k = 1,
   d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\b\n\u0002\b\b\u0018\u00002\u00020\u0001B\u0017\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\b\b\u0002\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006R\u0011\u0010\u0002\u001a\u00020\u0003¢\u0006\b\n\u0000\u001a\u0004\b\u0007\u0010\bR\u001a\u0010\u0004\u001a\u00020\u0005X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\t\u0010\n"\u0004\b\u000b\u0010\f¨\u0006\r"},
   d2 = {"Lcom/example/androidcoroutines/MyClass;", "", "context", "", "x", "", "(Ljava/lang/String;I)V", "getContext", "()Ljava/lang/String;", "getX", "()I", "setX", "(I)V", "app_debug"}
)
public final class MyClass {
   @NotNull
   private final String context;
   private int x;

   @NotNull
   public final String getContext() {
      return this.context;
   }

   public final int getX() {
      return this.x;
   }

   public final void setX(int var1) {
      this.x = var1;
   }

   public MyClass(@NotNull String context, int x) {
      Intrinsics.checkNotNullParameter(context, "context");
      super();
      this.context = context;
      this.x = x;
      String var3 = "222";
   }

   // $FF: synthetic method
   public MyClass(String var1, int var2, int var3, DefaultConstructorMarker var4) {
      if ((var3 & 2) != 0) {
         var2 = 0;
      }

      this(var1, var2);
   }
}

可见data class有这样的一些特性

  1. 重写了hashCode和equals方法;
  2. 新增加了copy方法,用来实现拷贝一个对象并实现赋值;
  3. 对于构造方法中var类型的参数,会生成get和set方法,对于val类型,只会生成get方法。
  4. component对应的是构造方法中的参数,按照顺序排列,component1就是第一个参数,component2就是第二个参数;
  5. 构造方法执行时间早于init代码块
  6. data class 不能被继承。
相关推荐
顺遂1 小时前
基于Rokid CXR-M SDK的引导式作业辅导系统设计与实现
前端
代码搬运媛1 小时前
Generator 迭代器协议 & co 库底层原理+实战
前端
前端拿破轮1 小时前
从0到1搭建个人网站(三):用 Cloudflare R2 + PicGo 搭建高速图床
前端·后端·面试
功能啥都不会1 小时前
PM2 使用指南 - 踩坑记录
前端
HelloReader1 小时前
React 中 useState、useEffect、useRef 的区别与使用场景详解,终于有人讲明白了
前端
兆子龙1 小时前
CSS 里的「if」:@media、@supports 与即将到来的 @when/@else
前端
踩着两条虫1 小时前
AI 智能体如何重构开发工作流
前端·人工智能·低代码
代码老中医1 小时前
逃离"Div汤":2026年,当AI写了75%的代码,前端开发者还剩什么?
前端
左夕1 小时前
最基础的类型检测工具——typeof, instanceof
前端·javascript
yuki_uix1 小时前
递归:别再"展开脑补"了,学会"信任"才是关键
前端·javascript