前言
今天是十一的大好日子,可惜好多網站不讓用了。
在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的擴展類。操作類型有限定,但是可以自動組合