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

数据类和封闭类是Kotlin中的两种特殊的类,今天一块儿了解一下。更多精彩内容也能够关注个人微信公众号——Android机动车数据库

数据类

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

数据类的使用

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

咱们老是须要一个类来表示数据,例如要表示一个用户的数据,咱们会建立一个User类,并经过构造器传入两个属性:微信

class User(name: String, age: Int) {
    var mName = name
    var 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,并在前面加上 类名@this

对象的equals方法默认也是比较了两个对象的hashcode,两个对象hashcode不一样,天然返回false。spa

有时咱们的业务需求是这样的:打印对象,即按规则打印对象的全部属性,两个对象的全部属性值相同,则返回两个对象相等,因而乎咱们须要重写toString函数和equals函数,相信你们都会写,这里就再也不累赘了。code

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

所谓数据类,就是只定义必要的部分,其他部分能够自动生成。

从上面的类能够看出,只有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 Expr

data 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.count
    is Sun -> evel(expr.e1) + evel(expr.e2)
}
复制代码

总结

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

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

这里写图片描述
相关文章
相关标签/搜索