Kotlin學(xué)習(xí)筆記(9)- 數(shù)據(jù)類

系列文章全部為本人的學(xué)習(xí)筆記奸柬,若有任何不妥之處偎捎,隨時(shí)歡迎拍磚指正鹉梨。如果你覺得我的文章對你有用讳癌,歡迎關(guān)注我,我們一起學(xué)習(xí)進(jìn)步存皂!
Kotlin學(xué)習(xí)筆記(1)- 環(huán)境配置
Kotlin學(xué)習(xí)筆記(2)- 空安全
Kotlin學(xué)習(xí)筆記(3)- 語法
Kotlin學(xué)習(xí)筆記(4)- 流程控制
Kotlin學(xué)習(xí)筆記(5)- 類
Kotlin學(xué)習(xí)筆記(6)- 屬性
Kotlin學(xué)習(xí)筆記(7)- 接口
Kotlin學(xué)習(xí)筆記(8)- 擴(kuò)展
Kotlin學(xué)習(xí)筆記(8)- 擴(kuò)展(續(xù))
Kotlin學(xué)習(xí)筆記(9)- 數(shù)據(jù)類
Kotlin學(xué)習(xí)筆記(10)- 泛型
Kotlin學(xué)習(xí)筆記(11)- 內(nèi)部類和嵌套類
Kotlin學(xué)習(xí)筆記(12)- 委托
Kotlin學(xué)習(xí)筆記(13)- 函數(shù)式編程
Kotlin學(xué)習(xí)筆記(14)- lambda

這些天項(xiàng)目比較忙晌坤,一直在加班,現(xiàn)在周末了旦袋,趕緊把kotlin拿起來骤菠,繼續(xù)學(xué)習(xí)~

一、定義

在平時(shí)的使用中疤孕,我們會用到一些類來保持一些數(shù)據(jù)或狀態(tài)商乎,我們習(xí)慣上成為bean或者entity,也有的定義為model祭阀。kotlin中有專門處理這一種類的關(guān)鍵字:data鹉戚。

data class PersonData(var name : String, var age : Int)

這種由data修飾的類叫做數(shù)據(jù)類,編譯器自動(dòng)從在主構(gòu)造函數(shù)定義的全部特性中得到以下成員:

  • equals()/hashCode()
  • toString() 格式是 "PersonData(name=PersonData, age=20)"
  • componentN() 方法對應(yīng)按聲明順序出現(xiàn)的所有屬性
  • copy() 方法
如果有某個(gè)函數(shù)被明確地定義在類里或者被繼承专控,編譯器就不會生成這個(gè)函數(shù)抹凳。

上面是官方說法,換成通俗的說就是伦腐,如果在數(shù)據(jù)類里自定義了equals等某個(gè)方法赢底,那編譯器就不會再去生成它。

總結(jié)一下柏蘑,數(shù)據(jù)類的定義就是以下幾個(gè)特點(diǎn):

  1. 類由關(guān)鍵字data修飾(好像是廢話)
  2. 類的構(gòu)造參數(shù)必須由var/val修飾幸冻,否則編譯不通過
  3. ?編譯器會自動(dòng)生成一些常用方法,你可以自定義它們
  4. 和普通類一樣咳焚,如果你需要一個(gè)無參構(gòu)造方法洽损,可以將構(gòu)造方法的參數(shù)都設(shè)置默認(rèn)值

二、toString

如果沒有自定義的話黔攒,編譯器會自動(dòng)生成toString方法趁啸,輸出格式為類名+參數(shù)的順序值

// 定義數(shù)據(jù)類和普通類
data class PersonData(var name : String, var age : Int)
class PersonNormal(var name : String, val age : Int)

// 分別初始化并進(jìn)行toString輸出
fun test(){
    var personD = PersonData("PersonData", 20)
    var personN = PersonNormal("PersonNormal", 20)

    Log.d("test", personD.toString())
    Log.d("test", personN.toString())
}

// 輸出
PersonData(name=PersonData, age=20)
com.study.jcking.weatherkotlin.exec.PersonNormal@26b13e2

三、復(fù)制copy

copy方法可以讓我們方便的對數(shù)據(jù)類進(jìn)行賦值督惰,甚至是有修改的復(fù)制不傅。比如我們上面寫道的PersonD,如果我們想對它進(jìn)行賦值赏胚,并且將名字改為PersonCopy

var personC = personD.copy("Person Copy")
Log.d("test", personC.toString())

//輸出
PersonData(name=Person Copy, age=20)

我們只需要傳遞我們要修改的部分访娶,編輯器會自動(dòng)識別。上面的寫法大概是這種實(shí)現(xiàn)

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

如果我們的構(gòu)造參數(shù)中有多個(gè)參數(shù)類型一致觉阅,上面的寫法會按定義的順序優(yōu)先匹配

data class PersonData(var name : String, var age : Int, val sex : String)

var personD = PersonData("PersonData", 20, "male")
var personC = personD.copy("famale")

Log.d("test", personC.toString())

// 輸出
PersonData(name=famale, age=20, sex=male)

其實(shí)很明顯的崖疤,我們要修改的是sex,也就是第三個(gè)參數(shù)典勇。這時(shí)候需要指定參數(shù)名

var personC = personD.copy(sex = "famale")

// 輸出
PersonData(name=PersonData, age=20, sex=famale)

OK劫哼,完美

四、多聲明

多聲明割笙,也可以理解為變量映射权烧,這就是編譯器自動(dòng)生成的componentN()方法。

var personD = PersonData("PersonData", 20, "male")
var (name, age) = personD


Log.d("test", "name = $name, age = $age")

//輸出
name = PersonData, age = 20

上面的多聲明伤溉,大概可以翻譯成這樣

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

五般码、序列化

由于我們的項(xiàng)目中,要求所有數(shù)據(jù)類都序列化乱顾,那么在學(xué)習(xí)kotlin時(shí)自然就想到了數(shù)據(jù)類的序列化問題板祝。在Android Studio上,java的數(shù)據(jù)類可以通過Parcelable插件自動(dòng)進(jìn)行序列化走净,kotlin中暫時(shí)不能用券时,只能自己實(shí)現(xiàn)。實(shí)現(xiàn)方法和java中的手動(dòng)實(shí)現(xiàn)基本一致伏伯。

data class PersonData(var name : String, var age : Int, val sex : String) : Parcelable{
    override fun writeToParcel(p0: Parcel?, p1: Int) {
        p0?.writeString(this.name)
        p0?.writeInt(this.age)
        p0?.writeString(this.sex)
    }

    override fun describeContents(): Int {
        return 0
    }

    constructor(source: Parcel) : this(source.readString(), source.readInt(), source.readString())

    companion object {
        @JvmField val CREATOR: Parcelable.Creator<PersonData> = object : Parcelable.Creator<PersonData> {
            override fun createFromParcel(source: Parcel): PersonData {
                return PersonData(source)
            }

            override fun newArray(size: Int): Array<PersonData?> {
                return arrayOfNulls(size)
            }
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末革为,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舵鳞,更是在濱河造成了極大的恐慌震檩,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜓堕,死亡現(xiàn)場離奇詭異抛虏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)套才,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門迂猴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人背伴,你說我怎么就攤上這事沸毁》逅瑁” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵息尺,是天一觀的道長携兵。 經(jīng)常有香客問我,道長搂誉,這世上最難降的妖魔是什么徐紧? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮炭懊,結(jié)果婚禮上并级,老公的妹妹穿的比我還像新娘。我一直安慰自己侮腹,他們只是感情好嘲碧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著父阻,像睡著了一般呀潭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上至非,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天钠署,我揣著相機(jī)與錄音,去河邊找鬼荒椭。 笑死谐鼎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的趣惠。 我是一名探鬼主播狸棍,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼味悄!你這毒婦竟也來了草戈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤侍瑟,失蹤者是張志新(化名)和其女友劉穎唐片,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涨颜,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡费韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庭瑰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片星持。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖弹灭,靈堂內(nèi)的尸體忽然破棺而出督暂,到底是詐尸還是另有隱情揪垄,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布逻翁,位于F島的核電站饥努,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卢未。R本人自食惡果不足惜肪凛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一堰汉、第九天 我趴在偏房一處隱蔽的房頂上張望辽社。 院中可真熱鬧,春花似錦翘鸭、人聲如沸滴铅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汉匙。三九已至,卻和暖如春生蚁,著一層夾襖步出監(jiān)牢的瞬間噩翠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工邦投, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伤锚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓志衣,卻偏偏與公主長得像屯援,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子念脯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359

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