scala伴生對象,apply()及單例


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)
  }
    
}

 

執行代碼結果:

 

可以看到均為同一對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM