【Kotlin學(xué)習(xí)日記】Day13:數(shù)據(jù)類

大家好,我是William李梓峰奢方,歡迎加入我的Kotlin學(xué)習(xí)之旅搔扁。
今天是我學(xué)習(xí) Kotlin 的第十三天,內(nèi)容是 Data Classes - 數(shù)據(jù)類蟋字。

官方文檔:

Data Classes - 數(shù)據(jù)類

We frequently create a class to do nothing but hold data. In such a class some standard functionality is often mechanically derivable from the data. In Kotlin, this is called a data class and is marked as data:
我們經(jīng)常創(chuàng)建一個(gè)類卻僅僅是為了裝載數(shù)據(jù)稿蹲。這種(萬惡的 DTO)類的唯一功能就是傳遞數(shù)據(jù)而已。在 Kotlin 里面鹊奖,這種類就叫數(shù)據(jù)類场绿,并用 data 標(biāo)識(shí):

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

// 我更喜歡這樣:
data class User(
    val name: String,
    val age: Int
)

The compiler automatically derives the following members from all properties declared in the primary constructor:
編譯器自動(dòng)地處理所有在主要構(gòu)造器上聲明的形參,生成對(duì)應(yīng)的屬性嫉入,同時(shí)還會(huì)生成一些預(yù)設(shè)方法:

  • equals()/hashCode() pair,
  • toString() of the form "User(name=John, age=42)",
  • componentN() functions corresponding to the properties in their order of declaration,
  • copy() function (see below).

包括

  • equals() / hashCode() 這對(duì)方法,
  • toString() 方法璧尸,返回 如 “User(name=John, age=42)” 的字符串咒林,
  • componentN() 函數(shù)生成若干,按照那些屬性的聲明順序來生成爷光,這里又跳了垫竞,直接飛到 Destructuring Declarations
  • copy() 方法蛀序,見面欢瞪。

If any of these functions is explicitly defined in the class body or inherited from the base types, it will not be generated.
如果上述這些任何一個(gè)函數(shù)顯式地定義在一個(gè)類體中或從其他父類繼承過來,它則不會(huì)自動(dòng)生成了徐裸。(所以沒事就別繼承了遣鼓,也別手賤自己去定義,用默認(rèn)的挺好的)

To ensure consistency and meaningful behavior of the generated code, data classes have to fulfil the following requirements:
為了確保數(shù)據(jù)一致性和生成有意義的代碼重贺,數(shù)據(jù)類必須滿足以下要求:

  • The primary constructor needs to have at least one parameter;

  • All primary constructor parameters need to be marked as val or var;

  • Data classes cannot be abstract, open, sealed or inner;

  • (before 1.1) Data classes may only implement interfaces.

  • 主要構(gòu)造器至少要有一個(gè)形參

  • 所有的主要構(gòu)造器形參都要用 valvar 標(biāo)明骑祟;

  • 數(shù)據(jù)類不可以用 abstract, open, sealedinner 修飾;

  • (在 Kotlin1.1 之前)數(shù)據(jù)類只能實(shí)現(xiàn)接口气笙。

Since 1.1, data classes may extend other classes (see Sealed classes for examples).
自從 1.1 版本以來次企,數(shù)據(jù)類都可以 extend(繼承或擴(kuò)展) 其他類。(例如潜圃,密封類缸棵,又跳了)

On the JVM, if the generated class needs to have a parameterless constructor, default values for all properties have to be specified
(see Constructors).
在 JVM 里面,如果已經(jīng)生成的類需要一個(gè)無參構(gòu)造器谭期,那么所有屬性的默認(rèn)都需要被指定(請(qǐng)看 構(gòu)造器堵第,跳回去了吧凉,如果所有字段都有默認(rèn)值,編譯器會(huì)自動(dòng)生成一個(gè)無參構(gòu)造器)

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

Copying - 復(fù)制

It's often the case that we need to copy an object altering some of its properties, but keeping the rest unchanged.
我們經(jīng)常需要復(fù)制某個(gè)對(duì)象的部分字段型诚。而另外一部分字段不需要改變客燕。

This is what copy() function is generated for. For the User class above, its implementation would be as follows:
copy() 方法為此而生。例如上面的 User 類狰贯,就實(shí)現(xiàn)了一個(gè):

// 系統(tǒng)默認(rèn)生成一個(gè) copy()
fun copy(name: String = this.name, age: Int = this.age) = User(name, age)     

This allows us to write
我們可以這樣寫

val jack = User(name = "Jack", age = 1)
val olderJack = jack.copy(age = 2) // 直接改變 age 值也搓,而 name 不變

Data Classes and Destructuring Declarations - 數(shù)據(jù)類與解構(gòu)聲明

Component functions generated for data classes enable their use in destructuring declarations:
Component 方法 生成于數(shù)據(jù)類中,相當(dāng)于直接讓其能夠做 解構(gòu)聲明(又跳了)

val jane = User("Jane", 35) 
val (name, age) = jane  // 這里做了解構(gòu)聲明涵紊,有點(diǎn)像 bash shell 參數(shù)展開
println("$name, $age years of age") // prints "Jane, 35 years of age"

Standard Data Classes - 標(biāo)準(zhǔn)的數(shù)據(jù)類

The standard library provides Pair and Triple. In most cases, though, named data classes are a better design choice, because they make the code more readable by providing meaningful names for properties.
標(biāo)準(zhǔn)庫提供 Pair(一對(duì)) 和 Triple(三胞胎)傍妒。大多數(shù)情況下,即便如此摸柄,數(shù)據(jù)類的命名還是一個(gè)更好的設(shè)計(jì)選擇颤练,因?yàn)樗鼈兡軌蜃尨a可讀性更高一些。(Pair 和 Triple 都是 Kotlin 預(yù)設(shè)的類驱负,方便數(shù)據(jù)裝載嗦玖,這里官方更推薦自己寫)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跃脊,隨后出現(xiàn)的幾起案子宇挫,更是在濱河造成了極大的恐慌,老刑警劉巖酪术,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器瘪,死亡現(xiàn)場離奇詭異,居然都是意外死亡绘雁,警方通過查閱死者的電腦和手機(jī)橡疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庐舟,“玉大人欣除,你說我怎么就攤上這事〖套瑁” “怎么了耻涛?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘟檩。 經(jīng)常有香客問我抹缕,道長,這世上最難降的妖魔是什么墨辛? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任卓研,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奏赘。我一直安慰自己寥闪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布磨淌。 她就那樣靜靜地躺著疲憋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梁只。 梳的紋絲不亂的頭發(fā)上缚柳,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音搪锣,去河邊找鬼秋忙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛构舟,可吹牛的內(nèi)容都是我干的灰追。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼狗超,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼弹澎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起努咐,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤裁奇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后麦撵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溃肪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年免胃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惫撰。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡羔沙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厨钻,到底是詐尸還是另有隱情扼雏,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布夯膀,位于F島的核電站诗充,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诱建。R本人自食惡果不足惜蝴蜓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茎匠,春花似錦格仲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至汽馋,卻和暖如春侮东,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惭蟋。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工苗桂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人告组。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓煤伟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親木缝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子便锨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)我碟,斷路器放案,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 圖片來源:Pinterest 今天下午看了《愛樂之城》,有一個(gè)部分挺讓我揪心觸動(dòng)的矫俺,就是男女主人公在那個(gè)時(shí)期不適合...
    Stormy閱讀 117評(píng)論 2 1
  • 金庸的小說《俠客行》中的主人公石破天有著奇幻般的經(jīng)歷厘托,原本是小乞丐的他機(jī)緣巧合下得到了“少林羅漢伏魔功”與“太玄經(jīng)...
    宋老師聊方法論閱讀 833評(píng)論 0 1
  • 位置:Build Setting -> Prefix Herder $(SRCROOT) 添加PCH文件 1)選擇...
    絲絲雨涼閱讀 233評(píng)論 0 0