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

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

編譯器會把這一行代碼重寫為對生成的工廠方法apply的調用:Person.apply("Sally", 39)。
其次,編譯器會把所有類參數存儲為字段,并生成與參數同名的字段訪問器(getter/setter)方法。[7]例如,可以像這樣訪問Person對象的name和age:

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

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

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

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

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

最后,編譯器還會向類中添加copy方法,并向伴生對象中添加unapply方法。我們將在第13章介紹這些方法的用途。
所有這些約定俗成的做法都為我們帶來了很大的便利(代價卻不高)。只需要多寫一個case修飾符,你的類和對象就會稍微變大。這是因為編譯器幫我們生成了額外的方法,以及與每個傳入構造方法參數相對應的字段。
- Vue.js設計與實現
- Beginning C++ Game Programming
- Java異步編程實戰
- C語言程序設計習題解析與上機指導(第4版)
- C++ Builder 6.0下OpenGL編程技術
- JavaScript+jQuery網頁特效設計任務驅動教程(第2版)
- Apache Spark 2 for Beginners
- OpenCV for Secret Agents
- Mastering OpenCV 4
- C語言程序設計同步訓練與上機指導(第三版)
- Visual C++開發入行真功夫
- R語言與網絡輿情處理
- 利用Python進行數據分析
- Scratch趣味編程:陪孩子像搭積木一樣學編程
- Java程序設計與項目案例教程