在Scala中沒(méi)有靜態(tài)方法和靜態(tài)字段,但是可以使用object這個(gè)語(yǔ)法結(jié)構(gòu)來(lái)達(dá)到同樣的目的
目前成都創(chuàng)新互聯(lián)已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、勃利網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
1.scala類似于Java中的工具類,可以用來(lái)存放工具函數(shù)和常量
2.高效共享單個(gè)不可變的實(shí)例
3.單例模式
單例對(duì)象雖然類似于Java中的工具類,但它不是,還是一個(gè)對(duì)象,可以把單例對(duì)象名看做一個(gè)貼在對(duì)象上的標(biāo)簽。
package?logging
//使用關(guān)鍵字object定義單例對(duì)象
object?Logger?{ ??def?info(message:?String):?Unit?=?println(s"INFO:?$message") }
單例對(duì)象的使用
//導(dǎo)入單例對(duì)象信息,使之在當(dāng)前類可見(jiàn)
import?logging.Logger.info class?Project(name:?String,?daysToComplete:?Int) class?Test?{ ??val?project1?=?new?Project("TPS?Reports",?1) ??val?project2?=?new?Project("Website?redesign",?5) ????//調(diào)用單例對(duì)象中定義的方法 ??info("Created?projects")??//?Prints?"INFO:?Created?projects" }
類和單例對(duì)象的區(qū)別是,單例對(duì)象不能帶參數(shù),單例對(duì)象不能用new關(guān)鍵字實(shí)例化,所以沒(méi)有機(jī)會(huì)傳遞給它實(shí)例化的參數(shù)。
單例對(duì)象在第一次訪問(wèn)的時(shí)候才會(huì)初始化。
當(dāng)單例對(duì)象與某個(gè)類同名時(shí),它被稱為類的伴生對(duì)象,類和伴生對(duì)象必須定義在一個(gè)源文件里,類稱為該單例對(duì)象的伴生類,類和他的伴生對(duì)象可以互相訪問(wèn)其私有成員。
不與伴生類共享名稱的單例對(duì)象被稱為獨(dú)立對(duì)象,可以作為相關(guān)功能的工具類,或者scala應(yīng)用程序的入口點(diǎn)。
在Scala的類中,與類名相同并且用object修飾的對(duì)象叫做伴生對(duì)象,類和伴生對(duì)象之間可以相互訪問(wèn)私有的方法和屬性,他們必須存在同一個(gè)源文件中
class?AccountInfo?{ //類的伴生對(duì)象的功能特性并不在類的作用域 //所以不能直接用newUniqueNumber()調(diào)用伴生對(duì)象的方法 var?id?=?AccountInfo.newUniqueNumber() } object??AccountInfo?{ ??private?var?lastNumber?=?0 ??private?def?newUniqueNumber()?=?{ ????lastNumber?+=?1;?lastNumber ??} ??def?main(args:?Array[String])?{ ??//相當(dāng)于Java中的靜態(tài)方法調(diào)用 ????println(AccountInfo.newUniqueNumber()) ??} }
通常我們會(huì)在類的伴生對(duì)象中定義apply方法,當(dāng)遇到類名(參數(shù)1,...參數(shù)n)時(shí)apply方法會(huì)被調(diào)用
class?AccountInfo?{ } object??AccountInfo?{ ??private?var?lastNumber?=?0 ??private?def?apply(arg?:Int)?=?{ ????lastNumber?=?arg*2?+?1;?lastNumber ??} ??def?main(args:?Array[String])?{ ????println(AccountInfo(1)) ??} }
Scala程序都必須從一個(gè)對(duì)象的main方法開(kāi)始,可以通過(guò)擴(kuò)展App特質(zhì),不寫main方法。 object?Hello?extends??App{ ??println("Hello?World") } 同 object?Hello?{ ??def?main(args:?Array[String]):?Unit?=?{ ????println("Hello?World") ??} }
帶有unapply方法的對(duì)象,經(jīng)常用在模式匹配或者偏函數(shù)中。
import?scala.util.Random object?CustomerID?{ ??def?apply(name:?String)?=?s"$name--${Random.nextLong}" ??def?unapply(customerID:?String):?Option[String]?=?{ ????val?name?=?customerID.split("--").head ????if?(name.nonEmpty)?Some(name)?else?None ??} } //調(diào)用apply方法創(chuàng)建一個(gè)對(duì)象,等價(jià)于CustomerID.apply("Sukyoung") val?customer1ID?=?CustomerID("Sukyoung")??//?Sukyoung--23098234908 customer1ID?match?{ ????//調(diào)用unapply方法,提取name信息 ??case?CustomerID(name)?=>?println(name)??//?prints?Sukyoung ??case?_?=>?println("Could?not?extract?a?CustomerID") }