美文网首页
kotlin data数据类和copy函数

kotlin data数据类和copy函数

作者: Bfmall | 来源:发表于2022-11-11 15:30 被阅读0次

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)
    }

}

相关文章

网友评论

      本文标题:kotlin data数据类和copy函数

      本文链接:https://www.haomeiwen.com/subject/vznazrtx.html