官术网_书友最值得收藏!

4.4 樣例類

在通常情況下,當你編寫一個類的時候,需要實現諸如equalshashCodetoString、字段訪問器(getter/setter)、工廠方法等。這些可能非常耗時且容易出錯。Scala提供了“樣例類”,可以基于傳遞給它的主構造方法的值來生成若干方法的實現。可以通過在class關鍵字之前加上case修飾符來聲明樣例類,就像這樣:

加上case修飾符以后,編譯器將會生成若干有用的方法。首先,編譯器將會創建一個伴生對象并放入名稱為apply的工廠方法中。于是你就可以像這樣構造一個新的Person對象:

編譯器會把這一行代碼重寫為對生成的工廠方法apply的調用:Person.apply("Sally", 39)

其次,編譯器會把所有類參數存儲為字段,并生成與參數同名的字段訪問器(getter/setter)方法。[7]例如,可以像這樣訪問Person對象的nameage

再次,編譯器會提供toString方法的實現:

此外,編譯器會為類生成hashCode方法和equals方法的實現。這些方法會基于傳入構造方法的參數來生成結果。舉例來說,一個Person對象在進行相等性判斷或計算散列值(hash code)時,會同時考慮nameage

對于那些已經自行實現的方法,編譯器不會重新生成或覆蓋,而是會沿用你的實現。也可以向類和伴生對象添加其他字段和方法。這里有一個例子,你可以在Person伴生對象中自行定義apply方法,這樣編譯器就不會生成,而你還可以繼續在Person類中添加appendToName方法:

這里的apply方法用于確保名稱的首字符是大寫的:

也可以調用剛定義的appendToName方法:

最后,編譯器還會向類中添加copy方法,并向伴生對象中添加unapply方法。我們將在第13章介紹這些方法的用途。

所有這些約定俗成的做法都為我們帶來了很大的便利(代價卻不高)。只需要多寫一個case修飾符,你的類和對象就會稍微變大。這是因為編譯器幫我們生成了額外的方法,以及與每個傳入構造方法參數相對應的字段。

主站蜘蛛池模板: 积石山| 岢岚县| 冷水江市| 合作市| 金门县| 永宁县| 九江市| 西昌市| 临夏县| 梁河县| 绍兴县| 扶余县| 石首市| 衡水市| 颍上县| 渭南市| 广平县| 虹口区| 红安县| 怀集县| 华宁县| 潞西市| 饶平县| 元朗区| 化隆| 涞源县| 乌鲁木齐县| 鸡西市| 承德市| 三穗县| 化州市| 南乐县| 通榆县| 丘北县| 三门县| 萝北县| 荔波县| 屏南县| 吉林市| 洛川县| 祁门县|