转向Kotlin——数据类和封闭类

数据类和封闭类是Kotlin中的两种特殊的类,今天一起了解一下。更多精彩内容也可以关注我的微信公众号——Android机动车

数据类

数据类是Kotlin的一个语法糖。Kotlin编译器会自动为数据类生成一些成员函数,以提高开发效率。

数据类的使用

无论是Java服务器开发还是Android开发,实体类自然是特别熟悉,它就是将Json格式转化为一个只包含数据和基本操作方法的实体类,以方便网络存取和数据库存取。

我们总是需要一个类来表示数据,例如要表示一个用户的数据,我们会创建一个User类,并通过构造器传入两个属性:

class User(name: String, age: Int) {var mName = namevar mAge: Int = age
}
复制代码

我们定义实体类,除了要保存数据之外,还需要输出对象的值,比较对象等操作,前者会用到toString函数,后者会用到equals函数,如下:

var user1 = User("js", 20)
var user2 = User("lx", 12)println(user1)
println(user2)
println(user1.equals(user2))
复制代码

输出结果是:

User@3764951d
User@4b1210ee
false
复制代码

从结果可以看出,输出User的两个对象时,调用了这两个对象的toString方法,但toString函数默认会调用hashcode函数,输出当前对象的hashcode,并在前面加上 类名@

对象的equals方法默认也是比较了两个对象的hashcode,两个对象hashcode不同,自然返回false。

有时我们的业务需求是这样的:打印对象,即按规则打印对象的所有属性,两个对象的所有属性值相同,则返回两个对象相等,于是乎我们需要重写toString函数和equals函数,相信大家都会写,这里就不再累赘了。

尽管前面写的User类实现了我们的需求,但会不会也太麻烦了,每个类都需要重写toString和equals等方法。为了提高开发效率,Kotlin加入了我们马上要介绍的数据类。

所谓数据类,就是只定义必要的部分,其余部分可以自动生成。

从上面的类可以看出,只有name和age是必须的,其余的都是可以自动推导的。**数据类规定:属性要通过主构造器指定,而且还要在class关键字之前加data。**我们再写一个数据类,如下:

data class Person(var name: String, val age: Int)
复制代码

可以看出,原本十几行几十行的代码,现在一行就搞定了,其余的Kotlin编译器会自动生成。

数据类也和普通类一样,也可以继承其他类,有一些其他的成员函数等。

编写一个数据类需要注意:

  • 主构造器至少要有一个参数;
  • 主构造器的参数要用var或val修饰;
  • 数据类不能是抽象类、open类、封闭类或者内部类。

由于主构造器中必须至少要有一个参数,所以在数据类中,不可能存在无参的主构造器,要想让数据类拥有一个无参的构造器,有以下两种方法:

  1. 为主构造器的每一个参数都加上默认值;
  2. 添加一个没有参数的次构造器,并调用主构造器同时指定各参数。
data class MPerson(var name: String = "js", var age: Int = 20)data class NPerson(var name: String, var age: Int) {// 次构造器,this调用主构造器,并指定参数constructor() : this("js", 20)
}
复制代码

对象的复制

在开发中,我们经常需要复制一个对象,然后修改它的一部分属性,这就需要复制机制,Kotlin除了为数据类自动生成toString方法和equals方法,还默认生成了一个copy方法,它的作用就是复制数据类的实例。代码如下:

var person = Person("wj", 20)
var mCopyPerson1 = person.copy()
var mCopyPerson2 = person.copy(name = "js")
复制代码

数据类成员的解构

所谓解构,就是解除结构,指的是将数据对象中的属性提取出来,分别赋给单个变量。

Kotlin编译器会自动为数据类生成组件函数(以后会说到),因此,可以直接将数据类成员解构:

var js = Person("Js", 20)
// 将js.name和js.age分别赋给name和age变量
var (name, age) = js
println("$name, is $age years old")
复制代码

封闭类

封闭类可以看作是枚举的扩展。一个封闭类,前面用sealed关键字标识。可以有任意多个子类和对象。封闭类的值只能是这些子类和对象。

使用封闭类的好处是when表达式,不需要再使用else形式了。看个例子:

sealed class Exprdata class Const(var count: Int) : Expr()
data class Sun(var e1: Expr, var e2: Expr) : Expr()fun evel(expr: Expr): Int = when (expr) {is Const -> expr.countis Sun -> evel(expr.e1) + evel(expr.e2)
}
复制代码

总结

在Kotlin中提供了一些特殊的类,其中数据类和封闭类就是其中的两个。尽管这些特殊的类并不是必须的,但有些时候使用它们会给我们的开发带来很大的方便,尤其是数据类。

更多精彩内容,欢迎关注我的微信公众号——Android机动车

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/538754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea前端可视化_jsp可视化开发工具_netbeans jsp可视化_idea 可视化开发 jsp

数字生态钜惠来袭!秒杀 2核4G 5M带宽 1200元/3年,1核1G首购 99元/年把默认改成 myeclipse jsp editor()原默认的jsp编辑器是 myeclipse visual jspdesigner,顾名思义,此编译器是jsp可视化编辑器,对于初学者有很多的帮助…

开博尔智能android播放器,高端安卓播放器的选择——开博尔Q10Plus 二代 4K高清播放器...

随着OPPO和三星相继宣布退出4K蓝光播放器市场,先锋的新机迟迟无法大量铺货,现在市面上可选择的4K播放器就比较少了,价格也很高了,于是很多人开始将注意力转向了安卓机,其中开博尔是比较有代表性的厂家了,这…

17.类型转换

自动类型转换 容量小的数据类型可以自动转换为容量大的数据类型 byte b 123;//byte b2 300;//报错,超过了byte最大值127//char c -3;//报错,char范围是0~65536,不在范围char c2 a;//a在ascii码里是98int i c2;long d01 123213;float f…

docker rabbitmq_一文看懂Rabbitmq,从安装到实战演练

Rabbitmq的初步使用随着微服务概念发展,大应用逐步拆分为小应用,提高开发效率,专门的人做专门的事情,逐渐的流行起来。在微服务上实现通信的方式大部分是采用rpc方式,也有升级版本的grpc。还有另外一种实现就是使用mq来…

Angular v6 正式发布

Angular 6 正式发布 Angular 6 已经正式发布了!这个主要版本并不关注于底层的框架,更多地关注于工具链,以及使 Angular 在未来更容易快速推进。 作为发布的一部分,我们同步了主要的框架包 (angular/core, angular/common, angula…

bootstrap五星评分_如何用纯代码实现评分星级显示?

showRatingStars/*** showRatingStars 显示评分星级* param {Object} myCanvas 画布对象* param {Number} rating 评分* param {Number} counts star个数* param {Number} size star大小* param {Object} style star样式* Example: style {* borderColor:"#21DEEF",…

18.变量

Java是一种强类型语言,每个变量都必须声明其类型。 Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。 变量在使用前必须对其声明,只有在变量声明以后,才能为其分配相应长度的存储单元。 注意事项…

alertdialog android api 11,android – 设备api级别11的DialogFragments

我设法在兼容包的DialogFragment.java中正确修复了这个问题:改变第74行:boolean mShowsDialog false;注释掉第232行:// mShowsDialog mContainerId 0;然后将两个show方法更改为:public void show(FragmentManager manager, Str…

py 字典添加多个value_# Python 3 # Python 3字典Dictionary(1)

Python3 字典字典是另一种可变容器模型,且可存储任意类型对象。字典的每个键值(key>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:d {key1 : value1, key2 : value2 }键必须是唯…

饶军:Apache Kafka的过去,现在,和未来

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文首发在云社区,未经许可,不得转载。大家好,我大概简单的介绍一下,我叫饶军,我是硅谷的初创公司Confluent的联合创始人之一,我们公司…

机器人 树莓派 自闭症_用机器人孩子提高社交能力 让自闭儿童走出自闭

一项由耶鲁大学的研究团队研究发现,通过让患有自闭症谱系障碍(autism spectrum disorders,ASD)的孩童与机器人相处一个月,极大地提高了自闭症儿童的社交能力。耶鲁大学研究中的机器人可以通过眼神接触和模仿其它社交行为,通过讲故事和互动游戏…

19.常量-final

final 常量 final修饰,只能被初始化一次。 public static void main(String[] args){final int a3;a4;//报错/*TestVariable.java:7: 错误: 无法为最终变量a分配值a4;^ 1 个错误*/}常量一般用大写来修饰。 ------------- 更多的Java,Angular,…

Android手机avi转换为mp4手机,如何把avi转换为mp4

AVI是目前比较常见的一种音视频交错格式,这种格式的文件在多种地方是可以看到的,大多在游戏录制、光盘文件中可以见到此类文件。其画质不错,适合在电脑上观看,但是现在我们使用较多的是手机、iPad等设备。如果我们想要在这些设备上…

伪代码书写规范_C++代码书写规范(推荐新手程序员)

代码就是程序员的面子,无论是在工作中在电脑上写程序代码还是在面试时在纸上写演示代码我们都希望写出整洁,优雅的代码。特别在工作中当我们碰到需要维护别人的代码,或者是多人参与一个项目大家一起写代码的时候,如果碰到一些丑陋…

Java基础17:Java IO流总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/80201802 这位大侠,这是我的公众号:程序员江湖。 分享程序员面试与技术的那些事。 干货满满,关注就送。 本文介…

nuxt页面跳转_nuxt 项目如何解决组件复用时页面不刷新的问题

组件复用会在两种情况下发生:1、使用 keep-alive 时,页面再次跳转时,数据不更新每一次路由的切换都会导致页面被重新渲染,无论是各种钩子还是异步获取数据函数都会被执行,为了提高网站性能,可以使用 keep-a…

20.命名规范

所有变量,方法,类名:见名知意 变量,方法名 --首字母小写和驼峰原则。 如:run(),getName() 常量 ---大写字母和下划线:MAX_VALUE 类名 ---首字母大写和驼峰原则。 如:Man,HelloWorld ------…

k8s查看pod的yaml文件_K8s-yaml的使用及命令

YAML配置文件管理对象对象管理:# 创建deployment资源kubectl create-f nginx-deployment.yaml# 查看deploymentkubectl get deploy# 查看ReplicaSetkubectl get rs# 查看pods所有标签kubectl get pods--show-labels# 根据标签查看podskubectl get pods-l appnginx# …

Orange Business Services 全球发布 Easy Go Network,帮助企业加速实现“网络即服务”...

100% 数字化, 软件定义网络( SDN) 产品在 75 个国家上市 在云、移动化、大数据和物联网(IoT)趋势的推动下,企业不断寻求更加智能和更加灵活的网络,以支持他们的数字化转型方案。而网络只有演进至“网络即服务”(NaaS&a…

vue的html自动刷新,Vue页面刷新记住页面状态的实现

环境vue项目,页面有搜索、筛选项等。需求页面跳转,切换或者刷新,希望可以记住用户在页面的筛选状态方案v1vue有提供一种缓存组件的解决方案 — keep-alive。缓存不活动的组件实例,而不是销毁它们。我们可以使用keep-alive包括路由…