Kotlin中的data类–为数据而生,为数据而美
我们在写程序时,不可避免的会进行数据的操纵。在进行数据操纵时,我们会专门的编写一些类。如果这些类写的多了,你会发现这些类都有一些比较类似的特点,因为这些特点的存在,Kotlin很人性化的将这些东西总结出来,让程序员可以减少大量的工作。
费话不多说,先看个例子。这个例子在也赶个时髦,说说Kotlin那些事 也用过,为了充分体现Kotlin的优越性,会将Kotlin代码与Java代码进行比较:
先来一个Java代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
public final class Person { private String name; private int age; private float height; public Person(String name, int age, float height) { this.name = name; this.age = age; this.height = height; } public Person(String name, int age) { this.name = name; this.age = age; this.height = 1.8f; } 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 float getHeight() { return height; } public void setHeight(float height) { this.height = height; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", height=" + height + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; if (age != person.age) return false; if (Float.compare(person.height, height) != 0) return false; return name != null ? name.equals(person.name) : person.name == null } @Override public int hashCode() { int result = name != null ? name.hashCode() : 0; result = 31 * result + age; result = 31 * result + (height != +0.0f ? Float.floatToIntBits(height) : 0); return result; } } |
恩,代码不算长,熟练工15分钟的工作量吧。
再看看Kotlin的代码:
1 |
data class Person(var name: String, var age: Int, var height: Float = 1.8f) |
恩,也不短,非熟练工2分钟吧。看到差别了吧。这就是Kotlin的魅力。在class之前的data帮你做好所有的工作,主要做的工作有:
1、自动实现equals() / hashCode() 方法
2、自动实现toString() 格式是 “Person(name=John, age=42,height=1.8)”,
3、按声明顺序对应的所有属性,
4、copy() 函数。
有人说上面自动实现的这些方法和自己想实现的不太一样,怎么办?Kotlin里面还有一个特性:
如果这些函数中的任何一个在类体中显式定义或继承自其基类,则不会自动生成该函数。
看到这里,我承认我说错了,上面的Java代码和Kotlin代码并没有实现相同的功能,Kotlin的代码实现的功能比Java代码实现的功能还多。多了一个功能非常强大的copy函数。
copy是怎么实现的呢,怎么用呢,有什么意义呢?也给大家说一下:
在现实生活中经常会出现这种情况,我们要复制一个对象,只改变他的一小部分属性,就像两个双胞胎,他们只有名字不一样,就可以用copy方法。
copy方法大约是这样实现的:
1 |
fun Person(name: String = this.name, age: Int = this.age, height: Float) = User(name, age, height) |
两种用法:
1 2 |
val jack = Person(name = "Jack", age = 1) val olderJack = jack.copy(age = 2) |
啧啧啧,Java该面红耳赤了吧!!!
下面来给Java补充点信心,Kotlin的数据类也有一点点限制:
1、主构造函数需要至少有一个参数;
2、主构造函数的所有参数需要标记为 val 或 var ;
3、数据类不能是抽象、开放、密封或者内部的;
数据类真是个好东西!
原创文章,文章首发于:Riley Ge (@rileyge) — Steemit
原创文章,转载请注明: 转载自TsonTec:测量解决方案提供者
本文链接地址: Kotlin中的data类–为数据而生,为数据而美
说点什么