《快學Scala》第六章——對象 學習筆記

本章要點概覽:

用對象作爲單例或存放工具方法。

  • 類可以擁有一個同名的伴生對象。
  • 對象可以擴展類或特質。
  • 對象的apply方法通常用來構造伴生類的新實例。
  • 如果不想顯示定義main方法,可以用擴展App特質的對象。
  • 可以通過擴展Enumeration對象來實現枚舉。

6.1 單例對象

Scala沒有靜態方法或靜態字段,可以用object這個語法結構來達到同樣的目的。對象定義了某個類的單個實例,包含想要的特質。例如:
object Accounts{
    private var lastNumber = 0
    def newUniqueNumber() = { lastNumber += 1;lastNumber }
}
當在應用程序中需要一個新的唯一賬號時,調用Accounts.newUniqueNumber()即可。
對象的構造器在該對象第一次被使用時調用。如果一個對象從未被使用,那麼其構造器也不會被執行。
對象本質上可以擁有類的所有特性——甚至可以擴展其他類或特質。只有一個例外:不能提供構造器參數。
對於任何在Java或C++中會使用單例的地方,在Scala中都可以用對象來實現:
  • 作爲存放工具函數或常量的地方。
  • 高效地共享單個不可變實例。
  • 需要用單個實例來協調某個服務時(參考單例模式)。
    class Account{
    
說明:Scala提供的是工具,可以做出好的設計,也可以做出糟糕的設計,需要做出自己的判斷。

6.2 伴生對象

在Java或C++中,通常會用到既有實例方法又有靜態方法的類。在Scala中,可以通過類和與類同名的“伴生”對象來達到同樣的目的。
class Account{
    val id = Account.newUniqueNumber()
    private var balance = 0.0
    def deposit(amount: Double) { balance += amount }
    ......
}

object Account{      //伴生對象
    private var lastNumber = 0
    private def newUniqueNumber() = { lastNumber += 1; lastNumber }
}
類和它的伴生對象可以相互訪問私有特性。它們必須存在於同一個源文件中。
 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章