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 不能被继承。
相关推荐
web前端神器6 分钟前
指定阿里镜像原理
前端
枷锁—sha11 分钟前
【DVWA系列】——CSRF——Medium详细教程
android·服务器·前端·web安全·网络安全·csrf
枷锁—sha12 分钟前
跨站请求伪造漏洞(CSRF)详解
运维·服务器·前端·web安全·网络安全·csrf
群联云防护小杜28 分钟前
深度隐匿源IP:高防+群联AI云防护防绕过实战
运维·服务器·前端·网络·人工智能·网络协议·tcp/ip
汉得数字平台1 小时前
【鲲苍提效】全面洞察用户体验,助力打造高性能前端应用
前端·前端监控
花海如潮淹1 小时前
前端性能追踪工具:用户体验的毫秒战争
前端·笔记·ux
_丿丨丨_6 小时前
XSS(跨站脚本攻击)
前端·网络·xss
天天进步20156 小时前
前端安全指南:防御XSS与CSRF攻击
前端·安全·xss
拾光拾趣录8 小时前
括号生成算法
前端·算法
拾光拾趣录9 小时前
requestIdleCallback:让你的网页如丝般顺滑
前端·性能优化