Kotlin學習筆記(9)- 資料類
系列文章全部為本人的學習筆記,若有任何不妥之處,隨時歡迎拍磚指正。如果你覺得我的文章對你有用,歡迎關注我,我們一起學習進步!
Kotlin學習筆記(1)- 環境配置
Kotlin學習筆記(2)- 空安全
Kotlin學習筆記(3)- 語法
Kotlin學習筆記(4)- 流程控制
Kotlin學習筆記(5)- 類
Kotlin學習筆記(6)- 屬性
Kotlin學習筆記(7)- 介面
Kotlin學習筆記(8)- 擴充套件
Kotlin學習筆記(8)- 擴充套件(續)
Kotlin學習筆記(9)- 資料類
Kotlin學習筆記(10)- 泛型
Kotlin學習筆記(11)- 內部類和巢狀類
Kotlin學習筆記(12)- 委託
Kotlin學習筆記(13)- 函數語言程式設計
Kotlin學習筆記(14)- lambda
這些天專案比較忙,一直在加班,現在週末了,趕緊把kotlin拿起來,繼續學習~
一、定義
在平時的使用中,我們會用到一些類來保持一些資料或狀態,我們習慣上成為bean
或者entity
,也有的定義為model
。kotlin中有專門處理這一種類的關鍵字:data。
data class PersonData(var name : String, var age : Int)
這種由data修飾的類叫做資料類
equals()
/hashCode()
toString()
格式是"PersonData(name=PersonData, age=20)"
componentN()
方法對應按宣告順序出現的所有屬性copy()
方法
如果有某個函式被明確地定義在類裡或者被繼承,編譯器就不會生成這個函式。
上面是官方說法,換成通俗的說就是,如果在資料類裡自定義了equals
等某個方法,那編譯器就不會再去生成它。
總結一下,資料類的定義就是以下幾個特點:
- 類由關鍵字
data
修飾(好像是廢話) - 類的構造引數必須由
var
/val
修飾,否則編譯不通過 - 編譯器會自動生成一些常用方法,你可以自定義它們
- 和普通類一樣,如果你需要一個無參構造方法,可以將構造方法的引數都設定預設值
二、toString
如果沒有自定義的話,編譯器會自動生成toString
方法,輸出格式為類名+引數的順序值
// 定義資料類和普通類
data class PersonData(var name : String, var age : Int)
class PersonNormal(var name : String, val age : Int)
// 分別初始化並進行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) [email protected]26b13e2
三、複製copy
copy方法可以讓我們方便的對資料類進行賦值,甚至是有修改的複製。比如我們上面寫道的PersonD
,如果我們想對它進行賦值,並且將名字改為PersonCopy
var personC = personD.copy("Person Copy")
Log.d("test", personC.toString())
//輸出
PersonData(name=Person Copy, age=20)
我們只需要傳遞我們要修改的部分,編輯器會自動識別。上面的寫法大概是這種實現
fun copy(name: String = this.name, age: Int = this.age) = PersonData(name, age)
如果我們的構造引數中有多個引數型別一致,上面的寫法會按定義的順序優先匹配
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)
其實很明顯的,我們要修改的是sex
,也就是第三個引數。這時候需要指定引數名
var personC = personD.copy(sex = "famale")
// 輸出
PersonData(name=PersonData, age=20, sex=famale)
OK,完美
四、多宣告
多宣告,也可以理解為變數對映,這就是編譯器自動生成的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()
五、序列化
由於我們的專案中,要求所有資料類都序列化,那麼在學習kotlin時自然就想到了資料類的序列化問題。在Android Studio上,java的資料類可以通過Parcelable
外掛自動進行序列化,kotlin中暫時不能用,只能自己實現。實現方法和java中的手動實現基本一致。
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) } } } }
小禮物走一走,來簡書關注我
作者:我愛吃栗子啊
連結:https://www.jianshu.com/p/cc30cf245ef6
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。