====== 'Loan' pattern ======
Ensures that a resource is deterministically disposed of once it goes out of scope.
The normal way to do this in Java is with a ''try ... finally'' block, which leads to ugly and fragile code, especially when there are multiple resources:
var r : Resource = null
try {
r = getResource()
useResource(r)
} finally {
if(r != null) r.dispose()
}
This can be improved in Scala by encapsulating the disposal code in a function which takes a closure:
def using[A](r : Resource)(f : Resource => A) : A =
try {
f(r)
} finally {
r.dispose()
}
The client code now looks like this:
using(getResource())(r =>
useResource(r)
)
The ''using'' function above can be generalized to arbitrary resources by letting the resource type be a type parameter. Assuming that ''Resource'' is a mixin class requiring the definition of a ''dispose'' method, one can write:
def using[A, R <: Resource](r : R)(f : R => A) : A =
try {
f(r)
} finally {
r.dispose()
}
Probably best of all, though, is to provide library functions that call ''getResource()'' internally. Then we would have, for each resource, a function that looks like this:
def withResource[A](f : Resource => A) : A = {
val r = getResource() // Replace with the code to acquire the resource
try {
f(r)
} finally {
r.dispose()
}
}
Client code becomes very simple:
withResource{ r =>
// do stuff with r....
}
Client code now obtains the resource 'on loan', and the compiler will guarantee that it is always returned. Care must still be taken to ensure that side-effects of ''f'' do not retain references to disposed resources.