Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Sử dụng loan pattern trong scala với using
Khi chúng ta sử dụng một resource
nào đó, ví dụ như File, DB Connection, sau khi sử dụng xong hoặc có Exception xảy ra chúng ta muốn close resource đó lại.
Thông thường trong java hoặc scala chúng ta có thể sử dụng Try/Catch/Finally
try {
val resource = openResource
} catch {
case ex: Exception => ex.printStackTrace
} finally {
resource.close
}
Sử dụng Try catch đi kèm với block rất khó chịu, nhất là khi chúng ta không biết nên "wrap" xử lý từ đâu đến đâu.
Bạn nào từng sử dụng C# chắc đều biết đến từ khoá using
. Using "abstract" xử lý try/catch/finally lại, và cung cấp cho chúng ta một interface dễ chịu hơn nhiều:
using (Font font3 = new Font("Arial", 10.0f),
font4 = new Font("Arial", 10.0f))
{
// Use font3 and font4.
}
Trong scala thì không có sẵn từ khoá using
, nhưng chúng ta có thể tạo ra một hàm với cùng cái tên và cách dùng này hết sức dễ dàng
def using[A <: {def close()},B](resource:A)(func:A => B):Unit = {
try{
func(resource)
}catch{
case e:Exception => e.printStackTrace
}finally{
if(resource != null) resource.close()
}
}
}
Có một syntax khá lạ mà chắc có một số bạn không biết.
[A <: {def close()}, B]
Đây là syntax cho Structural Typing
của scala, nghĩa là nhận vào bất cứ type A nào có implement hàm close.
Như vậy với hàm using trên, chúng ta có thể gọi Database connection, sau đó dùng xong close lại bằng một ngữ pháp rất sáng sủa:
object JavaLikeDatabaseSelect {
def main(args: Array[String]) = {
Class.forName("org.postgresql.Driver")
using(DriverManager.getConnection( "jdbc:postgresql://localhost/scaladb", "scalar", "scalar")){
db =>
val st = db.createStatement
val sql = "SELECT id, name FROM sample"
val res = st.executeQuery(sql)
while(res.next){
val id = res.getInt(1)
val name = res.getString(2)
println(id+", "+name)
}
}
}
}
Cách sử dụng using như trên gọi là Loan pattern trong scala.







