Kotlin 數(shù)據(jù)類與密封類

數(shù)據(jù)類

Kotlin 可以創(chuàng)建一個(gè)只包含數(shù)據(jù)的類固蛾,關(guān)鍵字為 data:

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

編譯器會(huì)自動(dòng)的從主構(gòu)造函數(shù)中根據(jù)所有聲明的屬性提取以下函數(shù):

    equals() / hashCode()
    toString() 格式如 "User(name=John, age=42)"
    componentN() functions 對(duì)應(yīng)于屬性扒披,按聲明順序排列
    copy() 函數(shù)

如果這些函數(shù)在類中已經(jīng)被明確定義了饥侵,或者從超類中繼承而來,就不再會(huì)生成。
為了保證生成代碼的一致性以及有意義萄凤,數(shù)據(jù)類需要滿足以下條件:

    主構(gòu)造函數(shù)至少包含一個(gè)參數(shù)。
    所有的主構(gòu)造函數(shù)的參數(shù)必須標(biāo)識(shí)為val 或者 var ;
    數(shù)據(jù)類不可以聲明為 abstract, open, sealed 或者 inner;
    數(shù)據(jù)類不能繼承其他類 (但是可以實(shí)現(xiàn)接口)搪哪。

復(fù)制

復(fù)制使用 copy() 函數(shù)靡努,我們可以使用該函數(shù)復(fù)制對(duì)象并修改部分屬性, 對(duì)于上文的 User 類,其實(shí)現(xiàn)會(huì)類似下面這樣:

fun copy(name: String = this.name, age: Int = this.age) = User(name, age)

使用 copy 類復(fù)制 User 數(shù)據(jù)類,并修改 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)

}

數(shù)據(jù)類以及解構(gòu)聲明

組件函數(shù)允許數(shù)據(jù)類在解構(gòu)聲明中使用:

val jane = User("Jane", 35)
val (name, age) = jane
println("$name, $age years of age") // prints "Jane, 35 years of age"

標(biāo)準(zhǔn)數(shù)據(jù)類

標(biāo)準(zhǔn)庫提供了 Pair 和 Triple 惑朦。在大多數(shù)情形中兽泄,命名數(shù)據(jù)類是更好的設(shè)計(jì)選擇,因?yàn)檫@樣代碼可讀性更強(qiáng)而且提供了有意義的名字和屬性漾月。

密封類

密封類用來表示受限的類繼承結(jié)構(gòu):當(dāng)一個(gè)值為有限幾種的類型, 而不能有任何其他類型時(shí)病梢。在某種意義上,他們是枚舉類的擴(kuò)展:枚舉類型的值集合 也是受限的梁肿,但每個(gè)枚舉常量只存在一個(gè)實(shí)例蜓陌,而密封類 的一個(gè)子類可以有可包含狀態(tài)的多個(gè)實(shí)例。
聲明一個(gè)密封類吩蔑,使用 sealed 修飾類钮热,密封類可以有子類,但是所有的子類都必須要內(nèi)嵌在密封類中哥纫。
sealed 不能修飾 interface ,abstract class(會(huì)報(bào) warning,但是不會(huì)出現(xiàn)編譯錯(cuò)誤)

sealed class Expr
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 Const -> expr.number
    is Sum -> eval(expr.e1) + eval(expr.e2)
    NotANumber -> Double.NaN
}

使用密封類的關(guān)鍵好處在于使用when表達(dá)式的時(shí)候霉旗,如果能夠驗(yàn)證語句覆蓋了所有情況,就不需要為該語句再添加一個(gè) else 子句了蛀骇。上面的類都繼承了密封類Expr 所以Expr也就限定在了這些類型里面厌秒。使用密封類的關(guān)鍵好處在于使用 when 表達(dá)式 的時(shí)候,如果能夠 驗(yàn)證語句覆蓋了所有情況擅憔,就不需要為該語句再添加一個(gè) else 子句了鸵闪。

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
    // 不再需要 `else` 子句,因?yàn)槲覀円呀?jīng)覆蓋了所有的情況
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暑诸,一起剝皮案震驚了整個(gè)濱河市蚌讼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌个榕,老刑警劉巖篡石,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異西采,居然都是意外死亡凰萨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門械馆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胖眷,“玉大人,你說我怎么就攤上這事霹崎∩翰螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵尾菇,是天一觀的道長境析。 經(jīng)常有香客問我囚枪,道長,這世上最難降的妖魔是什么簿晓? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任眶拉,我火速辦了婚禮,結(jié)果婚禮上憔儿,老公的妹妹穿的比我還像新娘忆植。我一直安慰自己,他們只是感情好谒臼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布朝刊。 她就那樣靜靜地躺著,像睡著了一般蜈缤。 火紅的嫁衣襯著肌膚如雪拾氓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天底哥,我揣著相機(jī)與錄音咙鞍,去河邊找鬼。 笑死趾徽,一個(gè)胖子當(dāng)著我的面吹牛续滋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播孵奶,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疲酌,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了了袁?” 一聲冷哼從身側(cè)響起朗恳,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎载绿,沒想到半個(gè)月后粥诫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崭庸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年臀脏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冀自。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秒啦,靈堂內(nèi)的尸體忽然破棺而出熬粗,到底是詐尸還是另有隱情,我是刑警寧澤余境,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布驻呐,位于F島的核電站灌诅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏含末。R本人自食惡果不足惜猜拾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望佣盒。 院中可真熱鬧挎袜,春花似錦、人聲如沸肥惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜜葱。三九已至全景,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牵囤,已是汗流浹背爸黄。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留揭鳞,地道東北人炕贵。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像汹桦,于是被迫代替她去往敵國和親鲁驶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容