# Kotlin学习之-5.6 数据类

来源:互联网 发布:轩辕剑进阶数据 编辑:程序博客网 时间:2024/06/06 02:15

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) = janeprintln("$name, $age years old") // 输出"Jane, 35 years old"

标准数据类

标准库提供PairTriple。 在多数情况下,尽管命名的数据类在设计时是一个更好的选择,因为他们提供了有意义的属性名,这让代码可读性更好。


PS,我会坚持把这个系列写完,有问题可以留言交流,也关注专栏Kotlin for Android Kotlin安卓开发

原创粉丝点击