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有这样的一些特性:
- 重写了hashCode和equals方法;
- 新增加了copy方法,用来实现拷贝一个对象并实现赋值;
- 对于构造方法中var类型的参数,会生成get和set方法,对于val类型,只会生成get方法。
- component对应的是构造方法中的参数,按照顺序排列,component1就是第一个参数,component2就是第二个参数;
- 构造方法执行时间早于init代码块
- data class 不能被继承。