Kotlin 第十章:数据类

来源:互联网 发布:afnetworking上传json 编辑:程序博客网 时间:2024/06/03 19:15

Kotlin 第十章:数据类

意识到了之前的错误,抓紧时间赶紧学习,这一篇文章是数据类,在 Java 中我喜欢称之为 bean 对象,主要是是用来保存数据的,Kotlin 中的数据类和 Java 的数据类还是有所区别的。

数据类

在这样的类中一些函数只是机械的对它们持有的数据进行一些推导。在 Kotlin 中这样的类称之为 data 类,用 data 标注,下面对比一下创建一个数据类 Kotlin 和 Java 的区别:

Kotlin 创建一个 数据类:

data class User(var name: String, var age: Int, var gender: String)

Java 创建一个数据类:

public class Use {    public String name;    public int age;    public String gender;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    @Override    public String toString() {        return "Use{" +                "name='" + name + '\'' +                ", age=" + age +                ", gender='" + gender + '\'' +                '}';    }}

从两段代码中可以看得出来,在 Java 中创建一个并不完善的数据里需要的代码量是很大的,但是同样的一个数据类,在 Kotlin 中只是需要一行代码就可以搞定。

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

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

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

主构造函数应该至少有一个参数;
主构造函数的所有参数必须标注为 val 或者 var
数据类不能是 abstract,open,sealed,或者 inner ;
数据类不能继承其它的类(但可以实现接口)。
在 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)

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

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

标准数据类

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

后记

这一篇文章还是比较有用的,特别是在获取后台数据的时候,这样只需要简简单单的一行代码就可以完成一个复杂的类,所以 Kotlin 好多地方还是比较便捷的,今天的 Kotlin 数据类的学习到此告一段落,希望各位看客多多提出自己的宝贵意见。

参考

Kotlin中文文档