Scala學習筆記(六):物件
6.1單例物件
scala沒有靜態方法或靜態欄位,可以使用object這個語法來達到同樣的目的。物件定義了某個類的單個例項,包含了你想要的特性。
object Accounts{
private var lastNumber=0
def newUniqueNumber()={lastNumber+=1;lastNumber}
}
物件的構造器在物件第一次被使用的時候執行,在本例中Accounts的構造器在Accounts.newUNIQUEnumber()首次呼叫時執行。如果一個個物件從來沒被使用,構造器也不會被執行。
物件本質上擁有類的所有特性,甚至可以擴充套件其它類或特質。只有一個例外:你不用提供構造器引數。
什麼情況下使用物件:1.作為存放工具函式或常量的地方
2.高效的共享單個不可變例項
3.需要用單個例項來協調某個服務時。
6.2伴生物件
在Jave中,通常會遇到既有例項方法又有靜態方法的類=。在Scala中,你可以通過類和類的伴生物件來達到同樣的目的。列如:
class Account{
val id=Account.newUniqueNumber()
private var balance=0.0
def deposit(amout:Double) {
balance+=amout }
...
}
object Account{ //伴生物件
private var lastUmer=0
private def newUniqueNumbe() ={ lastNumber+=1;lastNumber}
類和他的伴生物件可以相互訪問私有特性,他們必須在同一個原始檔中,
說明:類的伴生物件可以被訪問,但並不在作用域中。舉例來說:Account類必須通過Account.newUniqueNumbe()而不是直接使用newUniqueNumber()來呼叫伴生物件的方法。
6.3擴充套件類或特質的物件
一個object可用擴充套件類以及一個或多個特質,其結果是一個擴充套件了指定類以及特質的類的物件。
6.4apply方法
我們通常會使用物件的apply方法,當遇到如下的表示式,apply方法就會被呼叫:
Object(引數1,....引數n)
通常,這個一個apply方法返回的是伴生類的物件。
6.5 應用程式
每個scala程式都有必須從一個物件的main方法開始,這個方法的型別Array[String]=>Unit:
object Hello extends App {
def main(args:Array[String]):Unit{
}
}
如果在呼叫應用程式設定了scala.time選項的話,程式退出會顯示逝去的時間。
$ scala -Dscala.time Hello Fred
App特質擴充套件自另一個特質DelayeInit,編譯器對該特質有特殊處理。
6.6列舉
scala沒有列舉型別,不過,標準類庫提供了一個Enumeration助手類,可以用於產生列舉。
定義一個擴充套件Enumeration類的物件並以value方法呼叫初始化列舉中的所有可選值。例如:
object TrafficLightColor extends Enumeration{
val red,Yellow,Green=Value
}