なんじゃくにっき

プログラミングの話題中心。

Scala de Design Pattern: Loan

 Scala Wikiに載っていたデザインパターン、Loanパターンをやってみる。
リソースの取得と開放はクラス側が受け持って、
使う側はリソースの開放忘れなどをきにせずに安全にクラスを使える、というパターン。
 
一般形は

def withResource[A](f : Resource => A) : A = {
val r = getResource()
try {
f(r)
} finally {
r.dispose()
}
}
のようになり、
 
使う側は
withResource{ r =>
// do stuff with r....
}
のようになる。
 
 
Loanパターンを使ってJDBC接続するコードを書いてみた。
package loan

import java.sql.{ Connection, DriverManager, PreparedStatement }

object JDBCUtil {
def withConnection[A](f: Connection => A): A = {
val con = DriverManager.getConnection("DB", "USER", "PASS");
try {
f(con)
} finally {
con.close()
}
}

def withStatement[B](f: PreparedStatement => B, sql: String): B = {
withConnection[B] { r =>
val stm = r.prepareStatement(sql)
try {
f(stm)
} finally {
stm.close()
}
}
}
}

object Main {
def main(args: Array[String]) = {
val f = { r: PreparedStatement =>
val rs = r.executeQuery
while (rs.next()) {
println(rs.getString("EMPNAME"))
}
}
JDBCUtil.withStatement[Unit](f, "SELECT * FROM EMP")
}
}

 
 …ScalaにはJDBCのラッパーであるscala.dbcがある。そのうちscala.dbc2になるっぽい。