scala学习手记28 - Execute Around模式
我們訪問資源需要關(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# 托管资源和非托管资源(Dispos
- 下一篇: 普通老实人的生活