Kotlin学习之-5.6 数据类
我们经常创建一个类只是用来持有数据,不做其他事情。在这样的类中,一些标准的功能是机械地从数据中衍生出来的。在Kotlin中,这样的类叫做数据类,用data
标识:
data class User(val name: String, val age: Int)
编译器会在主构造器中,自动给定义的所有属性都派生如下的成员:
equals
/hashcode()
toString()
用这样的形式`”User(name=John, age=42)”componentN()
函数对应定义的属性copy()
函数
如果任何上述函数在类主题中定义了,或者从基类中继承了,编译器都不会自动生成对应的函数。
为了保证生成代码的一致性并且是有意义的行为,数据类必须满足如下要求:
- 主构造器必须至少有一个参数
- 所有主构造器的参数必须被标识为
val
或者var
- 数据类不能是
abstract
,open
,sealed
,inner
的 - 数据类只能实现接口(v1.1之前要求)
在v1.1之后,数据类可以扩展其他类。详见Sealed classes
在JVM上,如果生成的类需要一个无参数的构造器,那么所有属性的默认值都必须明确。
data class User(val name: String = "", val age: Int = 0)
拷贝
我们经常需要拷贝一个对象,然后修改一些属性,而另一些维持不变。这就是copy()
函数生成的原因。对于上面例子中的User
类来说,它的拷贝函数的实现会是这样的:
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
这使得我们可以这样写
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
数据类和去结构化声明
为数据类生成的成员函数使得他们可以使用去结构化声明
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years old") // 输出"Jane, 35 years old"
标准数据类
标准库提供Pair
和Triple
。 在多数情况下,尽管命名的数据类在设计时是一个更好的选择,因为他们提供了有意义的属性名,这让代码可读性更好。
PS,我会坚持把这个系列写完,有问题可以留言交流,也关注专栏Kotlin for Android Kotlin安卓开发
作者:farmer_cc 发表于2017/6/29 10:11:44 原文链接
阅读:2 评论:0 查看评论