類和對象之單例對象(Singleton)

Scala比Java更爲面向對象的特色之一是scala不能定義靜態成員,而是代之以定義單例對象。除了用object關鍵字替換了class關鍵字之外,單例對象的定義看上去與類定義一致。程序員


當單例對象與某個類共享同一個名稱時,它就被稱爲是這個類的伴生對象。類和它的伴生對象必須定義在一個源文件裏。類被稱爲是這個單例對象的伴生類。類和它的伴生對象能夠互相訪問其私有成員。如例:工具


結果:spa


對於Java程序員來講,能夠把單例對象看成是Java中可能會用到的靜態方法工具類。也能夠用相似的語法作方法調用: 單例對象類 . 方法名,如上例:
Test1.show4("class")
然而單例對象不僅是靜態方法工具類。它一樣是頭等的對象
定義單例對象並無定義類型(在scala的抽象層次上說)。若是隻有Test1對象的定義,就不能創建Test1類型的變量或者能夠認爲,Test1類型是由單例對象的伴生類定義的scala


類和單例對象間的差異
單例對象不帶參數,而類能夠。由於單例對象不是用new關鍵字實例化的,因此沒機會傳遞給它實例化參數。每一個單例對象都被實現爲虛構類(synthetic class)的實例,並指向靜態的變量,所以它們與Java靜態類(靜態內部類??)有着相同的初始化語義。特別要指出的是,單例對象在第一次被訪問的時候纔會被初始化
注:虛構類的名字是對象名加上一個美圓符號($)。所以單例對象Test1的虛構類是:Test1$。
另外,沒有伴生類的單例對象被稱爲獨立對象。它能夠用在不少地方,例如做爲相關功能方法的工具類,或者定義scala應用的入口點。
對象

相關文章
相關標籤/搜索