首发于公众号: DSGtalk1989
9.Kotlin 数据类与密封类
-
数据类
在class前面加上
data
关键字,这个类就变成了数据类,会自动添加我们一般在java中需要添加的方法数据类不能继承,也不能被继承。
数据类的主构造函数不能无参
数据类的
copy
方法可以直接进行修改var s = Student("Tom", 23) var a = s.copy(age = 18)
-
密封类
又叫做密闭类,一般用来替代java中枚举类
sealed class UiOp { object Show: UiOp() object Hide: UiOp() } fun execute(view: View, op: UiOp) = when (op) { UiOp.Show -> view.visibility = View.VISIBLE UiOp.Hide -> view.visibility = View.GONE }
实际上我们不一定要内部继承的方式,卸载外面也行,不要被这种形式拘泥。
上面的例子就是我们定力了枚举展示和隐藏,然后通过
when
的方式,去操作View
。单单这个例子是看不出密闭类的优越性的,如果我们还需要对
View
进行移动的话,枚举就做不到了,但是密闭类可以。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 // 这个 when 语句分支不仅告诉 view 要水平移动,还告诉 view 需要移动多少距离,这是枚举等 Java 传统思想不容易实现的 //注意这里的is is UiOp.TranslateX -> view.translationX = op.px UiOp.TranslateY() -> view.translationY = op.px }
所以密闭类在我看来就是java枚举的拓展
并且密闭类只能在一个文件中进行申明
封闭类如果是class的话,用when匹配必须要加 is 或者 直接生成对象()
Kotlin学习笔记之 13 基础操作符run、with、let、also、apply