1:伴生對象與apply方法
如果一個class與一個object具有相同的名字,那么我們就認為它們互為伴生。object為class的伴生對象。如下圖所示,object Apply為class Apply的伴生對象。
需要注意的小細節是,伴生對象的apply函數哪怕沒有參數也需要加上一對”()”.
class Apply { def apply = { println(" class apply") } def test = println("class test") } object Apply{ def apply() = {//注意這里的apply()函數定義哪怕沒有參數,也不能省略() println("object apply") new Apply } } object main_ extends App{ val apply = Apply() apply.test }
我們可以在伴生對象里實現apply函數,在函數里做一些事情,如果我們想要得到class對象的實例,而沒有通過new的方式,那么它會先去執行該class的伴生對象的apply函數
執行上述代碼,結果:
object apply
class test
可以看到,第一行代碼得到一個apply對象,它首先執行了伴生對象的apply(),然后執行了class Apply的test(),可以表明它確實是一個class Apply對象。
apply的應用:
比如可以用來實現單例,需要兩個步驟,一把class的構造設為private,二在class的伴生對象里實現apply函數,在這里返回class的對象。
class Apply private {//構造函數私有化 def apply = { println(" class apply") } def test = println("class test") } object Apply{ val apply_i = new Apply()//伴生對象可以訪問類的私有屬性和函數 def apply() = {//注意這里的apply()函數定義哪怕沒有參數,也不能省略() println("object apply") apply_i } } object main_ extends App{ // val apply = Apply() // apply.test for(i <- 0 until 10){ val apply_i = Apply() println(apply_i) } }
執行代碼結果:
可以看到均為同一對象。