data class 限制
- data class 不能是 open 的,也就是没法被其他类继承
- data class 不能是抽象的
- data class 不能是 内部类
data class 自动生成的代码是什么样的
data class man(val name:String,val age:Int){
}
反编译后可以看到
自动生成了
- get set
- hashcode
- equals
- 带参数的构造函数
public final class Man {
@NotNull
private final String name;
private final int age;
@NotNull
public final String getName() {
return this.name;
}
public final int getAge() {
return this.age;
}
public Man(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
super();
this.name = name;
this.age = age;
}
@NotNull
public final String component1() {
return this.name;
}
public final int component2() {
return this.age;
}
@NotNull
public final Man copy(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
return new Man(name, age);
}
// $FF: synthetic method
public static Man copy$default(Man var0, String var1, int var2, int var3, Object var4) {
if ((var3 & 1) != 0) {
var1 = var0.name;
}
if ((var3 & 2) != 0) {
var2 = var0.age;
}
return var0.copy(var1, var2);
}
@NotNull
public String toString() {
return "Man(name=" + this.name + ", age=" + this.age + ")";
}
public int hashCode() {
String var10000 = this.name;
return (var10000 != null ? var10000.hashCode() : 0) * 31 + this.age;
}
public boolean equals(@Nullable Object var1) {
if (this != var1) {
if (var1 instanceof Man) {
Man var2 = (Man)var1;
if (Intrinsics.areEqual(this.name, var2.name) && this.age == var2.age) {
return true;
}
}
return false;
} else {
return true;
}
}
}
date class 的局限
- 没有无参构造函数。对某些框架可能不友好 。
- 生成的 hash 和 equals 函数可能不是我们需要的 ,比如在使用HashMap 和HashSet的时候,我们希望用 地址来判断 而不是 属性
Kotlin 没有无参构造函数引发的问题和解决方案
https://mp.weixin.qq.com/s?__biz=MzIzMTYzOTYzNA==&mid=2247483908&idx=1&sn=0c072a630198d4a23a7d3aec700c138b&chksm=e8a05d39dfd7d42f1494c5f0fcc0562112be6d8912e44fc51f17dee472f9ebdfaad7d930e3b1#rd
https://www.dazhuanlan.com/2019/12/12/5df134df6cec3/