Android Kotlin 数据类 data class 的相关总结

data class 是什么?

  • kotlin中用于存储数据的类
data class User(val name: String, val age: Int)

data class 的特点

  • 优势
    自动生成重写以下方法:
    • equals()/hashCode()
    • toString() 例如 User(name=John, age=42)
    • componentN() 来获取对应属性
    • copy() 功能
  • 限制
    • 构造函数至少需要一个参数
    • 构造函数参数需要标记var或val
    • 数据类不能是抽象的,开放的,密闭的,内部的

copy方法默认是浅拷贝

data class User(
    var name: String,
    var age: Int,
    var childName: ArrayList<String>
) : Serializable 
    @Test
    fun test() {
        val user1 = User("zy", 28, arrayListOf("zy1", "zy2"))
        val user2 = user1.copy()
        println(user1)
        println(user2)
        user1.age++
        user1.childName.add("zy3")
        println("改变user1后")
        println(user1)
        println(user2)
    }
  • 打印结果,发现user2中的数组跟着user1一起改变了,浅拷贝
User(name=zy, age=28, childName=[zy1, zy2])
User(name=zy, age=28, childName=[zy1, zy2])
改变user1后
User(name=zy, age=29, childName=[zy1, zy2, zy3])
User(name=zy, age=28, childName=[zy1, zy2, zy3])

重写copy函数实现深拷贝

  • 其中所依赖的其他对象也需要重写copy方法
  • 其中所依赖的数组需要调用clone或者toList来进行复制
data class User(
    var name: String,
    var age: Int,
    var childName: ArrayList<String>
) : Serializable {

    @Suppress("UNCHECKED_CAST")
    fun copy(): User {
        return User(name, age, childName.clone() as ArrayList<String>)
    }

}

最简单的深拷贝方式(序列化反序列化)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值