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

來源:互聯網
上載者:User

標籤:

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

 

執行代碼結果:

 

可以看到均為同一對象。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.