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 loanimport 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になるっぽい。