[Kotlin] DataClasses & Sealed Classes | Part.I
嗨大家今天好嗎(撥瀏海)~
今天我講的主題是大家常常會用到的兩個class,
也就是Data classes跟Sealed Classes。
我們就先來看Data classes吧!
Data Classes通常被我們用來保存一些和data相關的資訊,
像是今天我有一個Message Item,
裡面有一些我需要保存的資料,
像是id、內容、寄件者…等,
便很適合使用Data Classes做保存。
以往用JAVA寫這類型的class時,
我們往往要花比較多的時間去寫一些get, set等method,
即使直接按右鍵生成這些method,
管理起來仍然有些麻煩。
我們來看一下Bytecode好了,
可以透過AS提供的工具簡單地decompile。
由於這份Bytecode實在太長,
就不完整貼上來跟各位分享,
文章會再慢慢分method解說。
接下來我們要看的是compiler會自動幫你生成的內容,
這部分是依據你宣告的成員變數去產生的。
我們先看一下大致會產生哪些成員:
1.copy() function 2.equals()/hashCode() pair3.toString() of the form “User(name=John, age=42)”4.componentN() functions corresponding to the properties in their order of declaration
首先是equals()跟hashCode的方法
equals其實就是看data classes的成員變數們值是否一樣
而hashcode就是會做上面code寫的這種計算。
我們可以得到一些結論,
在data class中,
如果兩物件是equal的關係,那hashCode一定一致,
如果兩物件不是equal的關係,hashCode不一定不同。
這邊比較特別的是,
以前用JAVA在寫App的時候,
也會用到 equals
,
可以看看Object的equals method,
JAVA中,判斷兩個Object是否相等的方式是用 ==
,
也就是看兩個Object的記憶體位置是否相同。
而Kotlin的data class則是比較兩個物件的`資料內容`是否一致,
這是比較需要注意的地方~
在很多情況下,我們需要復制一個對象改變它的一些屬性,但其餘部分保持不變。 copy() function 就是為此而生成。
如果你想要產生一個跟本來訊息類似但是略為不同的新訊息,
比方說本來的訊息priority是3,
但現在我想要新訊息的內容都跟前一封一樣,
只是priority變為5(其實實務上這邊還有一個id的問題...)
那麼可以直接在copy的括號內指定要改變的內容,
如此一來就可以迅速獲得一個相似的物件。
toString我自己比較常用在debug的時候,
可能需要看這個object的內容,
這時候只要呼叫toString就可以很方便地看每個parameter的值。
在JAVA中直接打印object的話會得到記憶體位置,
Kotlin的toString功能減少了我們為了debug要去多寫的一些code。
componentN其實就是依照我們declare成員變數的順序,
會生成一個對應的關係
把MessageItem這個data class decompile的結果,
可以看到compiler依照declare的順序幫我們生成了component1~6,
那component對我們寫code有什麼用處呢?
這些為data classes生成的 Component 函数,
可以在解構聲明中被使用。
val (name, age) = person
今天有一個data class :person,
我們可以用上圖的寫法得到他的變量。
這種語法叫做解構宣告 (Destructuring Declarations)。
println(name)
println(age)
透過解構聲明,
我們可以迅速得到data class object的成員內容值,
這些值是可以獨立被使用的。
寫到這邊發現篇幅有點長,
本週會再把Sealed Class 的部分補上!
Reference:
https://kotlinlang.org/docs/reference/data-classes.html#data-classes
https://kotlinlang.org/docs/reference/multi-declarations.html