首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Kotlin系列之数据类和类委托

今天聊聊Kotlin中的数据类和委托类。

在Java中是没有数据类和类委托的概念的。但是简单一点说数据类就是我们常说的Java中的Bean,它只是单纯为了表示数据而存在,就是一个方便的数据容器,而类委托表面看来就是主要实现将一个类委托给另一个类,具体内容我们往下看。

Kotlin中的数据类

上一节的代码中我们讨论了Kotlin中的通用对象方法,我们演示用的类就可以看作是一个数据类。代码如下

Kotlin代码

不知道大家有没有觉得重写这些方法也是有套路的,其实在IDEA等IDE中都有一键生成这种模板代码的功能,所以我们根本不需要写。其实不止如此,在Kotlin中还有更简单的方法。

具体做法就是在你的数据类前面加一个关键字,Kotlin的编译器就会在背后自动帮你生成这些代码。就像下面这样。

Kotlin代码

是不是超级简洁,对于编译器自动生成的方法。

用来比较实例

用来生成作为类似于HashMap这种基于哈希的容器的键

用来生成按声明顺序排列的所有属性字段的字符串表达形式

这里需要注意的一点是,方法比较的字段是在中声明的属性,方法也是根据主构造方法中声明的属性来计算哈希值。没有在主构造方法中声明的属性不会加入到相等性检查和哈希值计算中去。

除了上面的三个方法,Kotlin编译器还为我们多生成了一个方法。那么为什么会有这个方法呢?它是用来做什么的呢?

先说一下,我们在声明一个数据类时,为了实现对象的不可变性,一般要求我们将主构造方法主的属性都声明为val的,这样就可以保证数据类的实例在生成以后是不可变的和安全的,这在HashMap这种要求key不可变的容器中是非常重要的。同时在多线程情况下,对象会一直保持初始状态,也是安全的。

那么方法是用来做什么的呢?该方法用来创建一个实例的副本,并且可以在创建时修改该副本实例的某些属性,就像下面这样。

输出结果

Kotlin中的类委托

类委托,表面意思就是将一个类委托给另一个类,那它的应用场景是什么呢?我们下面举一个例子。

我们扩展一个集合类,统计我们一共向集合中添加了多少次元素,也就是我们做了多少次添加操作,这里我们先使用Java来实现一下。

Java代码

我们的做法是实现了一个集合类,在内部维护一个HashSet,在add()和addAll()方法中做添加次数统计,其他函数的实现我们都委托给HashSet的实例来完成即可。

可以看出上面的大部分代码都是很冗余的,我们为了添加一个小功能,就必须得添加一些多余的委托代码,这是非常不划算的。那么针对这种情况,Kotlin做了类委托,帮我们来自动完成。我们看看Kotlin中该怎么实现上面的功能呢。

Kotlin代码

上面的代码先是在主构造方法中声明了一个实例,然后使用关键字表示将所有函数操做都委托给该实例,同时,对于需要变化的函数,我们进行重写实现我们的具体逻辑即可,是不是代码量大大减少了,逻辑也清晰了很多。

写在最后

通过上面的例子,我们又一次感受到了Kotlin的简洁,它可以在保证功能的基础上大大减少代码量,使代码更简洁,逻辑更加清楚。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180308G06DU100?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券