数据类

数据类

我们经常创建一个只保存数据的类。在这样的类中一些函数只是机械的对它们持有
的数据进行一些推导。在 kotlin 中这样的类称之为 data 类,用 data 标注:

data class User(val name: String, val age: Int)

编译器会自动根据主构造函数中声明的所有属性添加如下方法:
- equals() / hashCode 函数
- toString 格式是 “User(name=john, age=42)”
- [compontN()functions] (http://kotlinlang.org/docs/reference/multi-
- declarations.html) 对应按声明顺序出现的所有属性
- copy() 函数

如果在类中明确声明或从基类继承了这些方法,编译器不会自动生成。

为确保这些生成代码的一致性,并实现有意义的行为,数据类要满足下面的要求:

注意如果构造函数参数中没有 val 或者 var ,就不会在这些函数中出现;

  • 主构造函数应该至少有一个参数;
  • 主构造函数的所有参数必须标注为 val 或者 var ;
  • 数据类不能是 abstract,open,sealed,或者 inner ;
  • 数据类不能继承其它的类(但可以实现接口)。
  • 在 JVM 中如果构造函数是无参的,则所有的属性必须有默认的值,(参
  • 看Constructors);
  • data class User(val name: String = “”, val age: Int = 0)

复制

我们经常会对一些属性做修改但想要其他部分不变。这就是 copy() 函数的由
来。在上面的 User 类中,实现起来应该是这样:

fun copy(name: String = this.name, age: Int = this.age) = User(n
ame, age)

有了 copy 我们就可以像下面这样写了:

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 of age") //打印出 "Jane, 35 years of age"

标准数据类
标准库提供了 Pair 和 Triple 。在大多数情形中,命名数据类是更好的设计选
择,因为这样代码可读性更强而且提供了有意义的名字和属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值