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

mac2022-06-30  119

前言

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

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

最新回复(0)