Sử dụng loan pattern trong scala với using
Scala
50
White

huydx viết ngày 22/06/2015

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.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

116 bài viết.
942 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
148 14
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết gần 2 năm trước
148 14
White
118 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
118 15
White
95 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết 3 năm trước
95 10
Bài viết liên quan
White
10 0
Kí tự Regex cơ bản Về cơ bản thì các sử lý matching của scala.util.matching.Regex sẽ được "phó thác" (delegate) cho java Regex. Bạn có thể tạo một ...
huydx viết 3 năm trước
10 0
White
7 1
Trong scala kí tự _ được dùng với khá nhiều mục đích .. không liên quan đến nhau. Tạm note lại cái đã khi nào có time sẽ quay lại viết cẩn thận sa...
huydx viết 3 năm trước
7 1
White
0 0
(Bài viết hơi khó hiểu, dành cho bạn nào có hứng thú với type programming trong scala với các thư viện như shapeless chẳng hạn) Thông thường với m...
huydx viết hơn 2 năm trước
0 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
942 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!