生产中会遇到需要 密集资源型对象, 即资源集中在一个对象中,那么用户代码就不能一直保持着获得的所有资源,而应该在需要时就向资源供给方进行借贷,使用完毕之后立即归还。
对于具有GC的程序设计语言,它仅仅实现了内存资源的自动回收,而对于诸如文件IO,数据库连接,Socket连接等资源需要程序员自行实现资源的回收。
这样就很容易出现一些 人为的错误 (human error), Scala的借贷模式就是为了解决此类问题,使资源使用完毕被自动回收,我们不必操心资源回收的过程。借贷模式是保证资源自动回收的重要机制。
此外,Scala 中将函数也是对象,可以像参数那样传递给另一个函数的特征使得借贷模式更加有意义。客户代码借贷了所需的资源,接下来如何使用这些资源以完成特定的任务则由客户决定。
以下是一种借贷模式的写法:
type Closable = { def close(): Unit }
def using[R <: Closable, A](resource: R)(f: R => A): A = {
try {
f(resource)
} finally {
ignoring(classOf[Throwable]) apply {
resource.close()
}
}
}
大概意思为: 给定一个资源R,并将资源传递给用户空间,并回调算法f: R => A
;当过程结束时资源自动释放。
[R <: Closable, A] 表示 R
类型必须是具有Closable类型的子类型(即一定要拥有type Closable里面的方法 close),这是Scala
支持「鸭子编程」的一种重要技术。这代表拥有一个close():Unit的对象,都可以在这里使用,并且这个close最后将被自动调用。