Kotlin入門-數據類與密封類 的解脫,由繁至簡

在這裏插入圖片描述

前言

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

在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的擴展類。操作類型有限定,但是可以自動組合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章