Kotlin學習筆記(9)- 數(shù)據類

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

這些天項目比較忙,一直在加班,現(xiàn)在周末了,趕緊把kotlin拿起來,繼續(xù)學習~

一、定義

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

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

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

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

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

總結一下,數(shù)據類的定義就是以下幾個特點:

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

二、toString

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

// 定義數(shù)據類和普通類
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)
com.study.jcking.weatherkotlin.exec.PersonNormal@26b13e2

三、復制copy

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

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

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

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

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

如果我們的構造參數(shù)中有多個參數(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)

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

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()

五、序列化

由于我們的項目中,要求所有數(shù)據類都序列化,那么在學習kotlin時自然就想到了數(shù)據類的序列化問題。在Android Studio上,java的數(shù)據類可以通過Parcelable插件自動進行序列化,kotlin中暫時不能用,只能自己實現(xiàn)。實現(xiàn)方法和java中的手動實現(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)
            }
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容