Android kotlin之數據類和密封類(3)

1.數據類

經常創建一些只保存數據的類。 在這些類中,一些標準函數往往是從數據機械推導而來的。在 Kotlin 中,這叫做 數據類 並標記爲 data

data class Person(val name: String, val age: Int)

複製

在很多情況下,我們需要複製一個對象改變它的一些屬性,但其餘部分保持不變。 copy() 函數就是爲此而生成。對於上文的 User 類,其實現會類似下面這樣:

data class User(val name: String , val age: Int )

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2)

解構聲明

有時把一個對象 解構 成很多變量會很方便,例如:

val (name, age) = jane  //結構聲明

一個解構聲明會被編譯成以下代碼:

var name=jane.component1()
var age=jane.component2()

任何表達式都可以出現在解構聲明的右側,只要可以對它調用所需數量的 component 函數即可。 當然,可以有 component3() 和 component4() 等等

2.密封類

密封類來表示受限的類繼承結構:當一個值爲有限幾種的類型, 而不能有任何其他類型時。在某種意義上,他們是枚舉類的擴展:枚舉類型的值集合 也是受限的,但每個枚舉常量只存在一個實例,而密封類 的一個子類可以有可包含狀態的多個實例。

聲明一個密封類,使用 sealed 修飾類,密封類可以有子類,但是所有的子類都必須要內嵌在密封類中。

sealed 不能修飾 interface ,abstract class(會報 warning,但是不會出現編譯錯誤)

    sealed class Expr{ //密封類  默認private

        data class Const(val number: Double) : Expr()
        data class Sum(val e1: Expr, val e2: Expr) : Expr()
        object NotANumber : Expr()
    }

    fun eval(expr: Expr): Double = when (expr) {
        is Expr.Const -> expr.number
        is Expr.Sum -> eval(expr.e1) + eval(expr.e2)
        Expr.NotANumber -> Double.NaN
    }

一個密封類是自身抽象的,它不能直接實例化並可以有抽象(abstract)成員。

密封類不允許有非-private 構造函數(其構造函數默認爲 private

 

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