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 不能被继承。
相关推荐
AlienZHOU6 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
Captaincc9 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师10 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen11 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒11 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow11 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81811 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007811 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明12 小时前
第 6 章 组件进阶
前端·vue.js
江华森12 小时前
HTTP请求的完整过程详解:从DNS解析到TCP挥手的微秒级实战分析
前端