scala學習手記28 - Execute Around模式

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

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

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類的構造器標記為private,這樣就只能在Resource類內部和它的伴生類中創建實例了。因為只能在這兩個地方創建實例,從而保證是可以按照確定的方式使用這個類的對象了,也就可以保證其行為是按照確定的方式執行。cleanUp()方法也被標記為private,確保不會被意外調用。第一行的print語句是具體事務操作的占位符。調用構造函數時,事務啟動;調用cleanUp()函數時,事務終結。此外Resource類中還準備了一些實例方法,如op1()、op2()等。

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

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

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

代碼輸出結果是:

image

調用Resource的伴生對象時,會自動創建一個Resource實例,等到傳遞的函數值執行結束后,會自動調用cleanUp方法釋放占用的資源。

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

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

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

現在調用writeToFile()將一些內容寫入文件:

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

方法的執行結果:

image

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

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

轉載于:https://www.cnblogs.com/amunote/p/5720440.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284072.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【時序數據庫InfluxDB】Windows環境下配置InfluxDB+數據可視化,以及使用 C#進行簡單操作的代碼實例...

前言:如題。直接上手擼,附帶各種截圖,就不做介紹了。1、influxDB的官網下載地址 https://portal.influxdata.com/downloads/打開以后,如下圖所示,可以選擇版本號,以及平臺。此處咱們選擇windows平臺。不過…

官宣 微軟跨平臺 UI 框架 .NET MAUI 6 正式發布

微軟宣布 .NET MAUI 已正式 GA。 .NET MAUI (.NET Multi-platform App UI) 是一個跨平臺 UI 框架(前身是 Xamarin.Forms),用于通過 C# 和 XAML 創建原生移動和桌面應用。基于 .NET MAUI,開發者可在單個共享代碼庫中創建同時支持 A…

92. Reverse Linked List II

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m 2 and n 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the following condition:1 ≤ m ≤ n ≤ lengt…

Reset

在常用的代碼中,我們使用AddForm.form.reset();或者AddForm.getForm().reset();來將FormPanel重置。 但是當頁面增加和修改公用一個formpanel時,當先點擊修改時,窗體修改顯示出數據,關閉窗體后(window.hide()&#xff…

《.NET物聯網從零開始》系列

近日搞硬件網關時,那些殘存的數電、模電和通信原理的記憶時常在腦海中縈繞;想起來多年前看張高興的博客學會了.netcore樹莓派進行物聯網開發。使用dragonboard(龍板)搭載windows 10 iot系統,配合光電傳感器和rfid實現了一個項目原型。碰巧逛g…

設計好接口的 36 個錦囊(原則)

目錄 設計好接口的 36 個錦囊 | 接口參數校驗 | 修改老接口時,注意接口的兼容性 | 設計接口時,充分考慮接口的可擴展性 | 接口考慮是否需要防重處理 | 重點接口,考慮線程池隔離 | 調用第三方接口要考慮異常和超時處理 | 接口實現考慮…

嵌入式第11次實驗

嵌入式軟件設計第11次實驗報告 學號:140201236 姓名:沈樟偉 組別:第2組 實驗地點:D19 一、實驗目的: 1、了解短信AT指令的使用方法。 2、掌握使用短信AT指令驅動SIM900A發送和接收短信的方…

Linux文件系統之df

df用于查看當前掛載的文件系統-a 查看所有的文件系統可以自己指定容量單位,-BM -BG 但是還是h的選項好用-i 查看inode的使用信息-l(L) 顯示本地文件系統--output 可以指定管理員想要看的列--outputField_List可用的字段有source fstype itotal iused iavail ipcent …

普通老實人的生活

2019獨角獸企業重金招聘Python工程師標準>>> 有一個朋友,他家有一套營業房,租給了兩個年輕人,合同簽訂為半年,房租7000,合同到期當天,乙方一直沒有聯系甲方,說明續租或不續租&#x…

如何在 C# 中運行 Python 代碼

前言Python是一門強大的編程語言。特別的是,它還具有眾多出色的庫(例如numPy,sciPy,pandas等),可以顯著簡化和加速開發。因此,在解決某些問題時,通過 Python 實現可能是最理想的方式…

Ubuntu開機默認進入命令行模式/用戶圖形界面

一、開機默認進入命令行模式 # 輸入命令: sudo systemctl set-default multi-user.target # 重啟: reboot要進入圖形界面,只需要輸入命令startx 從圖形界面切換回命令行:ctrlaltF7 二、開機默認進入圖形用戶界面 # 輸入命令&…

數組查找數字5

public class Second {/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stubint []a{2,1,3,4,5};for (int i0;i<a.length-1;i){if(a[i]!5){i;}}System.out.println("這組數里有5呢"); }} 轉載于:https://www.cnblogs.co…

【QGIS入門實戰精品教程】10.2:QGIS中DEM三維顯示方法

QGIS中數字高程模型DEM三維顯示方法。 參考閱讀: 【ArcGIS Pro微課1000例】0006:ArcGIS Pro 2.5三維顯示DEM數字高程模型 【ArcGIS Pro微課1000例】0005:ArcGIS Pro 2.5基于矢量數據制作拉伸三維地圖案例 ArcGIS實驗教程——實驗二十六:ArcScene實現二維數據的三維顯示 文章…

AUTH password

為redis服務請求設置一個密碼。redis可以設置在客戶端執行commands請求前需要通過密碼驗證。通過修改配置文件的requirepass就可以設置密碼。 如果密碼與配置文件里面設置的密碼一致&#xff0c;服務端就會發會一個OK的狀態碼&#xff0c;接受客戶端發送其他的請求命令&#xf…

基于Dubbo框架構建分布式服務(三)

我們將上面開發的服務提供方服務&#xff0c;部署到2個獨立的節點上&#xff08;192.168.14.1和10.10.4.125&#xff09;&#xff0c;然后可以通過Dubbo管理中心查看對應服務的狀況&#xff0c;如圖所示&#xff1a; 上圖中可以看出&#xff0c;該服務有兩個獨立的節點可以提供…

開篇-開啟全新的.NET現代應用開發體驗

01云原生技術底座暢想DaprMASA Framework研發管理研發協作平臺&#xff1a;CI/CD、Application ManagementApplication Quota Management、Version Control、Troubleshooting、Testable網格應用程序管理API網關&#xff1a;Reverse Proxy、Traffic Control 、Security Strategy…

Ubuntu安裝docker詳細教程

1.安裝 sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - && sudo add-apt-repository &qu…

java多線程編程——鎖優化

并發環境下進行編程時&#xff0c;需要使用鎖機制來同步多線程間的操作&#xff0c;保證共享資源的互斥訪問。加鎖會帶來性能上的損壞&#xff0c;似乎是眾所周知的事情。然而&#xff0c;加鎖本身不會帶來多少的性能消耗&#xff0c;性能主要是在線程的獲取鎖的過程。如果只有…

【QGIS入門實戰精品教程】10.3:QGIS柵格DEM數據重復類方法案例匯總

QGIS柵格DEM數據重復類方法案例匯總:按表格重分類、按圖層重分類。 參考閱讀: 【GlobalMapper精品教程】029:柵格重分類案例詳解 ArcGIS實驗教程——實驗四十三:ArcGIS柵格重分類(Reclass)案例詳解 ArcGIS怎樣獲取重分類后各類所占的像元個數 文章目錄 一、按表格分類二、…

QT添加rtmp庫的時候出現問題

剛開始出現undefined reference to __chkstk的錯誤。 然后在vc里面找到chkstk.obj放到相關目錄下并在工程文件直接添加&#xff1a; LIBS "E:\QTProjects\RTMP\RTMPDelayTest\librtmp\lib\chkstk.obj" 又出現了新的錯誤 E:\QTProjects\RTMP\RTMPDelayTest\librtmp\l…