浅拷贝
浅拷贝创建一个新对象,该对象是原始对象的副本,但它不会创建嵌套对象的新副本。相反,新对象仅包含对与原始对象相同的嵌套对象的引用。
困惑?让我用一个例子来解释它:)
要在 Kotlin 中浅拷贝一个数据类,我们可以使用函数copy()
数据类 地址(var city: String)data class User(val name: String, val surname: String, val address: Address)val address = Address(“New York”)val originalUser = User(“John”, “Smith”, address) val copiedUser = originalUser.copy(name = “Ilyas”)println(originalUser) // User(name=John, surname=Smith, address=Address(city=New York))println(copiedUser) // User(name=Ilyas, surname=Smith, address=Address(city=New York)) // 更改原始用户地址 中的城市 originalUser.address.city = “San Francisco” println(originalUser) // User(name=John, surname=Smith, address=Address(city=San Francisco))println(copiedUser) // User(name=Ilyas, surname=Smith, address=Address(city=San Francisco))
请注意,复制用户后,仅更改了名称,其他所有内容保持不变。但是,当我们在 中修改城市时,也受到了影响originalUser
copiedUser
发生这种情况是因为复制函数没有复制嵌套对象值(地址),而只是将地址的引用分配给 。copiedUser
如果您看一下复制实现,那将是完全有意义的......
有趣的副本( 名称:字符串 = this.name,姓氏:字符串 = 这个姓氏, 地址:地址 = 这个.地址):用户 = 用户(姓名、姓氏、地址 )
注意:如果数据类的所有属性都是不可变的,我们就不会遇到这个问题。这是始终具有不可变属性的原因之一。
需要注意的另一件事是函数仅复制主构造函数中的属性。这意味着它不会复制您在类体内定义的任何属性。copy
数据类用户(值名称:字符串,...) { var isChanged = false } val originalUser = User(“John”, ...) originalUser.isChanged = true val copiedUser = originalUser.copy(name = “Ilyas”)println(originalUser.isChanged) // true println(copiedUser.isChanged) // 惊喜惊喜,这是假本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。