- Java中沒有專門的數(shù)據(jù)類,通常是通過JavaBean來做數(shù)據(jù)類李滴,但Kotlin中使用了專門的數(shù)據(jù)類。
- Kotlin中數(shù)據(jù)類是只保存數(shù)據(jù)的類,類中的標(biāo)準(zhǔn)函數(shù)往往是從數(shù)據(jù)機(jī)械性推導(dǎo)而來的祭衩。
- Kotlin可以創(chuàng)建只包含數(shù)據(jù)的類即數(shù)據(jù)類,數(shù)據(jù)類使用關(guān)鍵字
data
標(biāo)記阅签。
聲明數(shù)據(jù)類
data class <類名> <(主構(gòu)造函數(shù)參數(shù)列表)> [:繼承類和實現(xiàn)接口] [(/*類體*/)]
主構(gòu)造函數(shù)的參數(shù)列表必須使用val
或var
聲明為類屬性掐暮,而且要求 至少有一個,否則無法通過編譯政钟。
data class User(val id:Int, val name:String)
數(shù)據(jù)類功能
- 自動聲明與構(gòu)造函數(shù)入?yún)⑼膶傩宰侄?/li>
- 自動實現(xiàn)每個屬性字段的存取器方法
set/get
- 自動提供
equals
方法用于比較兩個數(shù)據(jù)對象是否相等 - 自動提供
copy
方法允許完整復(fù)制某個數(shù)據(jù)對象 - 自動提供
toString
方法
自動生成
Kotlin數(shù)據(jù)類只需要在class
關(guān)鍵字前添加data
關(guān)鍵字即可路克,編譯器會自動從主構(gòu)造函數(shù)中根據(jù)聲明的屬性推導(dǎo)出相關(guān)函數(shù)。
equals()
hashCode()
toString()
componentN() functions
copy()
數(shù)據(jù)類僅僅包含狀態(tài)而沒有任何可執(zhí)行的操作养交,使用數(shù)據(jù)類替換普通的好處是Kotlin會幫我們產(chǎn)生大量代碼精算。特別是幫我們省下大量重復(fù)性的工作:
- 在構(gòu)造函數(shù)中聲明是屬性
equals()/hashCodee()
- 一組
componentX()
copy()
如果這些函數(shù)在數(shù)據(jù)類中已經(jīng)被明確定義,或從超類中繼承而來則不再會生成碎连。
對于自動生成的函數(shù)灰羽,編譯器只使用主構(gòu)造函數(shù)內(nèi)部定義的屬性朦拖。
JVM中如果生成的類需要含有一個無參的構(gòu)造函數(shù)則所有屬性必須指定默認(rèn)值绵脯。
data class User(val id:Int = 0, val name:String = "")
約束條件
為了保證生成代碼的一致性以及有意義以,數(shù)據(jù)類需要滿足以下條件:
- 主構(gòu)造函數(shù)至少包含一個參數(shù)
- 所有的主構(gòu)造函數(shù)的參數(shù)必須標(biāo)識為
val
或var
- 數(shù)據(jù)類不可以聲明為抽象
abstract
飞主、開放open
座每、密封sealed
前鹅、內(nèi)部inner
- 數(shù)據(jù)類不能繼承其他類,但可實現(xiàn)接口峭梳。
對象復(fù)制
可使用復(fù)制函數(shù)復(fù)制對象并修改部分屬性
fun copy(id:Int = this.id, name:String = name) = User(id, name)
例如:使用copy
復(fù)制User
數(shù)據(jù)類并修改name
屬性
data class User(val id:Int, val name:String)
fun main(args:Array<String>){
val user = User(id=1, name="alice")
val older = user.copy(id = 2)
println(user)//User(id=1, name=alice)
println(older)//User(id=2, name=alice)
}
解析函數(shù)
- 解析函數(shù)
componentN()
用于數(shù)據(jù)類解析聲明舰绘,這里的N與主構(gòu)造函數(shù)中聲明的屬性數(shù)量是相同的蹂喻。 - 解析函數(shù)能夠?qū)ο蟮膶傩蕴崛〕鰜聿①x給一個值
- 數(shù)據(jù)類自帶解構(gòu)函數(shù)
componentN()
,組件函數(shù)也允許數(shù)據(jù)類在解析聲明中使用捂寿。
data class User(val id:Int, val name:String)
fun main(args:Array<String>){
val user = User(id=1, name="alice")
//數(shù)據(jù)類解析聲明
val (id, name) = user
println("id = $id, name=$name")//id = 1, name=alice
}
標(biāo)準(zhǔn)數(shù)據(jù)類
標(biāo)準(zhǔn)庫提供了Pair
和Triple