日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scala学习手记28 - Execute Around模式

發(fā)布時間:2023/12/9 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scala学习手记28 - Execute Around模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我們訪問資源需要關(guān)注對資源的鎖定、對資源的申請和釋放,還有考慮可能遇到的各種異常。這些事項本身與代碼的邏輯操作無關(guān),但我們不能遺漏。也就是說進(jìn)入方法時獲取資源,退出方法時釋放資源。這種處理就進(jìn)入了Execute Around模式的范疇。

在scala里可以用函數(shù)值實(shí)現(xiàn)這種模式。下面是一個示例,使用Resource類演示了事務(wù)的開啟和釋放:

class Resource private() {println("Starting transaction...")private def cleanUp() {println("Ending transaction...")}def op1 = println("Operation 1")def op2 = println("Operation 2")def op3 = println("Operation 3") }object Resource {def use(codeBlock: Resource => Unit) {val resource = new Resource try {codeBlock(resource)} finally {resource.cleanUp()}} }

這段代碼里將Resource類的構(gòu)造器標(biāo)記為private,這樣就只能在Resource類內(nèi)部和它的伴生類中創(chuàng)建實(shí)例了。因?yàn)橹荒茉谶@兩個地方創(chuàng)建實(shí)例,從而保證是可以按照確定的方式使用這個類的對象了,也就可以保證其行為是按照確定的方式執(zhí)行。cleanUp()方法也被標(biāo)記為private,確保不會被意外調(diào)用。第一行的print語句是具體事務(wù)操作的占位符。調(diào)用構(gòu)造函數(shù)時,事務(wù)啟動;調(diào)用cleanUp()函數(shù)時,事務(wù)終結(jié)。此外Resource類中還準(zhǔn)備了一些實(shí)例方法,如op1()、op2()等。

在伴生對象里有一個默認(rèn)public的方法use,它接收一個函數(shù)值作為參數(shù)。use()方法創(chuàng)建了一個Resource的實(shí)例,在try和finally塊的保護(hù)之下,把這個實(shí)例傳給了給定的函數(shù)值。在finally塊里,調(diào)用了Resource私有實(shí)例方法cleanUp()。

看一下是如何使用Resource類的:

Resource.use { resource =>resource.op1resource.op2resource.op3resource.op1 }

代碼輸出結(jié)果是:

調(diào)用Resource的伴生對象時,會自動創(chuàng)建一個Resource實(shí)例,等到傳遞的函數(shù)值執(zhí)行結(jié)束后,會自動調(diào)用cleanUp方法釋放占用的資源。

上面模式的一個變體是Loan模式。如果想確保非內(nèi)存資源得到確定性釋放,就可以使用這個模式??梢赃@樣認(rèn)為這種資源密集型的對象是借給你的,用過之后應(yīng)該立即歸還。

下面是一個Loan模式的例子:

import java.io._def writeToFile(fileName: String)(codeBlock: PrintWriter => Unit) = {val writer = new PrintWriter(new File(fileName))try {codeBlock(writer)} finally {writer.close()} }

現(xiàn)在調(diào)用writeToFile()將一些內(nèi)容寫入文件:

writeToFile("output.txt") { writer => writer write "hello from Scala" }

方法的執(zhí)行結(jié)果:

作為writeToFile()方法的使用者,我們不必操心文件的關(guān)閉。在代碼塊里,這個文件是借給我們用的。我們可以用得到的PrintWriter實(shí)例進(jìn)行寫操作,一旦從這個塊返回,方法就會自動關(guān)閉文件。

###############

轉(zhuǎn)載于:https://www.cnblogs.com/amunote/p/5720440.html

總結(jié)

以上是生活随笔為你收集整理的scala学习手记28 - Execute Around模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。