使用限制
先说data class 使用上的限制
- 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中。