1. 程式人生 > >Scala學習筆記(六):物件

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

}