今天是十一的大好日子,可惜好多网站不让用了。
在Kotlin中,数据类大大减少了实体类的代码量;
本节需要了解几个问题:
① data关键字实现了哪些函数?与Any相比多了哪些?
② 密封类sealed带来了什么好处?
③ 掌握 密封类的组合
这篇文章的目录如下
这简直就是完美解决了java中,一个数据类动不动就是一堆代码的窘境。在Kotlin中,只要一行就可以解决问题。简直便利极了。
在java中,为了解决getter & setter这种实现,特意引入了lombok。
或者在一些数据结构的response可以自动导出代码。
或许《NPE是一大优势》,然而data的存在实在幸福。
建一个只包含数据的类,关键字为 data
编译器会自动的从主构造函数中根据所有声明的属性提取以下函数
自动生成的函数
data class User(val name: String, val age: Int)
数据类具有非常便捷的copy实现,太快了。
在java中,这个copy引入了lombok来处理。也是麻烦的
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)
看范例
data class User(val name: String, val age: Int)
fun main(args: Array) {
val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)
println(jack)
println(olderJack)
}
这个简直太方便了。这里都是不一样的对象。爽的一逼。
是不是就没有浅拷贝的问题了
允许数据类在解构声明中使用
val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"
标准库提供了 Pair 和 Triple
表示受限的类继承结构;
当一个值为有限几种的类型,而不能有任何其他类型时;
密封类可以有子类,但是所有的子类都必须要内嵌在密封类中。
可以理解为
这就是enum动态扩展形式
范例
sealed class UiOp {
object Show: UiOp()
object Hide: UiOp()
class TranslateX(val px: Float): UiOp()//新增
class TranslateY(val px: Float): UiOp()//新增
}
fun execute(view: View, op: UiOp) = when (op) {
UiOp.Show -> view.visibility = View.VISIBLE
UiOp.Hide -> view.visibility = View.GONE
is UiOp.TranslateX -> view.translationX = op.px // 这个 when 语句分支不仅告诉 view 要水平移动,还告诉 view 需要移动多少距离,这在Java中实现起来并不方便
is UiOp.TranslateY -> view.translationY = op.px
}
你也可以定义一组操作
val ui = Ui() +
UiOp.Show +
UiOp.TranslateX(20f) +
UiOp.TranslateY(40f) +
UiOp.Hide
这是个组合
数据类:大大简化了代码量。自动生成了equals()、hashCode()、toString()、componentN()、copy()的代码。
密封类:这是enum的扩展类。操作类型有限定,但是可以自动组合