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)