這篇文章主要講解了“Scala的伴生類(lèi)和伴生對(duì)象實(shí)例介紹”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Scala的伴生類(lèi)和伴生對(duì)象實(shí)例介紹”吧!
讓客戶(hù)滿(mǎn)意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:主機(jī)域名、雅安服務(wù)器托管、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、吐魯番網(wǎng)站維護(hù)、網(wǎng)站推廣。
scala 是多范式編程語(yǔ)言。多范式,就是多種編程方法的意思。有哪些編程方法呢?目前說(shuō)來(lái),有面向過(guò)程,面向?qū)ο螅盒?,函?shù)式四種程序設(shè)計(jì)方法。
單例對(duì)象與類(lèi)同名時(shí),這個(gè)單例對(duì)象被稱(chēng)為這個(gè)類(lèi)的伴生對(duì)象,而這個(gè)類(lèi)被稱(chēng)為這個(gè)單例對(duì)象的伴生類(lèi)。伴生類(lèi)和伴生對(duì)象要在同一個(gè)源文件中定義,伴生對(duì)象和伴生類(lèi)可以互相訪問(wèn)其私有成員。不與伴生類(lèi)同名的單例對(duì)象稱(chēng)為孤立對(duì)象。
scala 對(duì)象程序入口絕對(duì)是ojbect Name {def main(args:Array[String]) {待執(zhí)行語(yǔ)句}}
看看例子:
import scala.collection.mutable.Map class ChecksumAccumulator { private var sum = 0 def add(b: Byte) { sum += b } def checksum(): Int = ~(sum & 0xFF) + 1 } object ChecksumAccumulator { private val cache = Map[String, Int]() def calculate(s: String): Int = if (cache.contains(s)) cache(s) else { val acc = new ChecksumAccumulator for (c <- s) acc.add(c.toByte) val cs = acc.checksum() cache += (s -> cs) println("s:"+s+" cs:"+cs) cs } def main(args: Array[String]) { println("Java 1:"+calculate("Java")) println("Java 2:"+calculate("Java")) println("Scala :"+calculate("Scala")) } }
ChecksumAccumulator單例對(duì)象有一個(gè)方法,calculate,用來(lái)計(jì)算所帶的String參數(shù)中字符的校驗(yàn)和。它還有一個(gè)私有字段,cache,一個(gè)緩存之前計(jì)算過(guò)的校驗(yàn)和的可變映射。2方法的第一行,“if (cache.contains(s))”,檢查緩存,看看是否傳遞進(jìn)來(lái)的字串已經(jīng)作為鍵存在于映射當(dāng)中。如果是,就僅僅返回映射的值,“cache(s)”。否則,執(zhí)行else子句,計(jì)算校驗(yàn)和。else子句的第一行定義了一個(gè)叫acc的val并用新建的ChecksumAccumulator實(shí)例初始化它。下一行是個(gè)for表達(dá)式,對(duì)傳入字串的每個(gè)字符循環(huán)一次,并在其上調(diào)用toByte把字符轉(zhuǎn)換成Byte,然后傳遞給acc所指的ChecksumAccumulator實(shí)例的add方法。完成了for表達(dá)式后,下一行的方法在acc上調(diào)用checksum,獲得傳入字串的校驗(yàn)和,并存入叫做cs的val。下一行,“cache += (s -> cs)”,傳入的字串鍵映射到整數(shù)的校驗(yàn)和值,并把這個(gè)鍵-值對(duì)加入cache映射。方法的最后一個(gè)表達(dá)式,“cs”,保證了校驗(yàn)和為此方法的結(jié)果。
這里打印的結(jié)果是:
s:Java cs:-130 Java 1:-130 Java 2:-130 s:Scala cs:-228 Scala :-228
問(wèn)題來(lái)了,ChecksumAccumulator單例對(duì)象是不能new的,但是在代碼中出現(xiàn)了val acc = new ChecksumAccumulator,這不是矛盾嗎?其實(shí)不然,這里new的其實(shí)是ChecksumAccumulator單例對(duì)象的伴生類(lèi),即ChecksumAccumulator類(lèi),而伴生類(lèi)和伴生對(duì)象可以互相訪問(wèn)對(duì)方的私有成員,所以acc可以訪問(wèn)ChecksumAccumulator單例對(duì)象的cache變量。同理,那么第一次測(cè)試“Java”字符串的時(shí)候,acc實(shí)例執(zhí)行了checksum()方法,接下來(lái)并把這個(gè)數(shù)據(jù)存到cache這個(gè)val中。在第二次測(cè)試“Java”字符串的時(shí)候,程序是直接從cache變量中獲取到了數(shù)據(jù),并返回。
這里也可以看出類(lèi)和單例對(duì)象的一個(gè)差別是,單例對(duì)象是在第一次訪問(wèn)的時(shí)候初始化,不可以new,不能帶參數(shù),而類(lèi)可以new,可以帶參數(shù)。每個(gè)單例對(duì)象都被作為由一個(gè)靜態(tài)變量指向的虛構(gòu)類(lèi):synthetic class的一個(gè)實(shí)例來(lái)實(shí)現(xiàn),因此它們與Java靜態(tài)類(lèi)有著相同的初始化語(yǔ)法。
感謝各位的閱讀,以上就是“Scala的伴生類(lèi)和伴生對(duì)象實(shí)例介紹”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Scala的伴生類(lèi)和伴生對(duì)象實(shí)例介紹這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!