case class在匹配模式和actor中經(jīng)常使用到调鲸,當(dāng)一個類被定義成為case類后槽卫,Scala會自動幫你創(chuàng)建一個伴生對象并幫你實現(xiàn)了一系列方法且?guī)砹瞬簧俸锰?/p>
1.實現(xiàn)了apply方法,意味著你不需要使用new關(guān)鍵字就能創(chuàng)建該類對象
scala> case class People(name:String,age:Int)
defined class People
scala> val p = People("mobin",22) //省略了new關(guān)鍵字
p: People = People(mobin,22)
2.實現(xiàn)了unapply方法,可以通過模式匹配來獲取類屬性,是Scala中抽取器的實現(xiàn)和模式匹配的關(guān)鍵方法
scala> p match { case People(x,y) => println(x,y) }
(mobin,22)
3.實現(xiàn)了類構(gòu)造參數(shù)的getter方法(構(gòu)造參數(shù)默認(rèn)被聲明為val)葱弟,但是當(dāng)你構(gòu)造參數(shù)是聲明為var類型的,它將幫你實現(xiàn)setter和getter方法(不建議將構(gòu)造參數(shù)聲明為var)
構(gòu)造參數(shù)為val的情況(默認(rèn)):
scala> p.name
res0: String = mobin
scala> p.name = "mobin1" //報錯猜丹,因為構(gòu)造參數(shù)被聲明為val所以并沒有幫你實現(xiàn)setter方法
<console>:10: error: reassignment to val
p.name = "mobin1"
構(gòu)造參數(shù)為var的情況:
scala> case class People(var name:String) //參數(shù)被聲明為var
defined class People
scala> val p = People("mobin")
p: People = People(mobin)
scala> p.name = "mobin2"
p.name: String = mobin2
scala> p.name
res1: String = mobin2 //修改成功芝加,并沒有報錯
4.還默認(rèn)幫你實現(xiàn)了toString,equals射窒,copy和hashCode等方法
總結(jié):
- case class比普通的class多了不少的方法藏杖,所以當(dāng)你不需要這些額外的方法時你就可以將類定義為普通的類,但是你又不想通過new關(guān)鍵字來創(chuàng)建實例脉顿,你可以在普通類中實現(xiàn)apply方法達到此目的
- 構(gòu)造器的每個參數(shù)都成為val蝌麸,除非顯式被聲明為var,但是并不推薦這么做艾疟;case本就旨在創(chuàng)建的是不可變數(shù)據(jù)来吩,所以在使用模式匹配時顯得極為容易,因為匹配模式的本質(zhì)就是傳遞值蔽莱,得到值取執(zhí)行對應(yīng)的邏輯
- 提供unapply方法使模式匹配可以工作弟疆;
- 生成toString、equals碾褂、hashCode和copy方法兽间,除非顯示給出這些方法的定義。