Kotlin入门-数据类与密封类 的解脱,由繁至简

Kotlin入门-数据类与密封类 的解脱,由繁至简_第1张图片

前言

今天是十一的大好日子,可惜好多网站不让用了。

在Kotlin中,数据类大大减少了实体类的代码量;
本节需要了解几个问题:
① data关键字实现了哪些函数?与Any相比多了哪些?
② 密封类sealed带来了什么好处?
③ 掌握 密封类的组合

这篇文章的目录如下

  • 数据类
    • 简述
  • 密封类
  • 小结

数据类

这简直就是完美解决了java中,一个数据类动不动就是一堆代码的窘境。在Kotlin中,只要一行就可以解决问题。简直便利极了。

在java中,为了解决getter & setter这种实现,特意引入了lombok。

或者在一些数据结构的response可以自动导出代码。

或许《NPE是一大优势》,然而data的存在实在幸福。

简述

建一个只包含数据的类,关键字为 data
编译器会自动的从主构造函数中根据所有声明的属性提取以下函数
自动生成的函数

  • equals() / hashCode()
  • toString() 格式如 “User(name=John, age=42)”
  • componentN() functions 对应于属性,按声明顺序排列
  • copy() 函数
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


密封类

表示受限的类继承结构;
当一个值为有限几种的类型,而不能有任何其他类型时;
密封类可以有子类,但是所有的子类都必须要内嵌在密封类中。

可以理解为

  • 专门用来配合 when 语句使用的类
  • 有了sealed关键字,就可以避免enum无可动态添加类型的缺陷
  • 因为其有子类的特性,可以方便的组合各个枚举类型

这就是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的扩展类。操作类型有限定,但是可以自动组合

你可能感兴趣的:([kotlin])