kotlin data数据类和copy函数
2022-11-11 本文已影响0人
Bfmall
data数据类和copy函数学习笔记###
/**
* DESC : data数据类和copy函数
*
* 数据类使用条件:
* 1.服务器请求返回的响应数据javabean,可以使用数据类
* 2.数据类必须包含至少一个参数的主构造函数
* 3.数据类必须有参数,val,var类型都可以
* 4.数据类不能使用open,abstract,sealed,inner等等修饰
* 5.有以下需求,比如toString,copy,解构等进行比较的时候,为了方便可specialProgram以使用
*/
const val KtBaseObjectTest06_TAG = "KtBaseObjectTest06"
/**
* 一般data数据类都用于javabean的形势
*/
data class BaseDataResponse(var msg : String, var code:Int, var data : Any)
/**
* 普通类
*/
class BaseDataResponse2(val msg : String, val code:Int, val data : Any)
data class StudentBean(var name : String , var age: Int) {
var info = ""
init {
Log.d(KtBaseObjectTest06_TAG, "主构造函数调用")
}
constructor(name : String) : this(name, 0) {
Log.d(KtBaseObjectTest06_TAG, "次构造函数调用")
info = "学生信息"
}
override fun toString(): String {
return "StudentBean(name=" + this.name + ", age=" + this.age+ ", info=" + this.info+ ")";
}
/*public String toString() {
return "StudentBean(name=" + this.name + ", age=" + this.age + ")";
}*/
}
class KtBaseObjectTest06 {
/**
* 数据类自动重写了toString(), hashCode(), equals(), copy()
* @NotNull
public String toString() {
return "BaseDataResponse(msg=" + this.msg + ", code=" + this.code + ", data=" + this.data + ")";
}
*/
fun testDataClass01() {
//data类输出结果:BaseDataResponse(msg=success, code=200, data=成功)
Log.d(KtBaseObjectTest06_TAG, BaseDataResponse("success", 200, "成功").toString())
//普通类输出结果:com.xyaty.kotlinbasedemo.base05.BaseDataResponse2@9381bfb
Log.d(KtBaseObjectTest06_TAG, BaseDataResponse2("success", 200, "成功").toString())
}
/**
* kt 的copy()函数
*/
fun testDataClass02() {
val student1 = StudentBean("zhangsan")
//testDataClass02==>student1=StudentBean(name=zhangsan, age=0)
Log.d(KtBaseObjectTest06_TAG, "testDataClass02==>student1="+student1)
/**
* 为什么toString中没有info字段,
*
* @NotNull
public String toString() {
return "StudentBean(name=" + this.name + ", age=" + this.age + ")";
}
@NotNull
public final StudentBean copy(@NotNull String name, int age) {
Intrinsics.checkParameterIsNotNull(name, "name");
return new StudentBean(name, age);
}
注意事项:
1.默认生成的toString, equals, hashcode, copy等,都是只管生成主构造函数中的参数,不管次构造函数中的参数
2.使用copy的时候,由于背后的内部代码只使用主构造函数的参数,不使用次构造函数的参数,
所以尽量重写toString函数,把次构造函数的参数加进去
*/
//只拷贝name和age
val student2 = student1.copy("lisi", 20)
//testDataClass02==>student2=StudentBean(name=lisi, age=20, info=)
Log.d(KtBaseObjectTest06_TAG, "testDataClass02==>student2="+student2)
}
}