2011年6月26日日曜日

ローンパターンを使用したリソース開放

リソースのオープンとクローズを共通化して、リソースをパラメータで受け取った関数にリソースを受け渡す実装方法。
関数にリソースを貸し出すことからローンパターンと言われるらしい。

  def main(args: Array[String]) {
    // 第二引数に、PrintWriterを受けて
    // ファイル出力を行う関数を指定する。
    writeFile(new File("test.txt"),
      writer => writeData(writer))
  }

  private def writeData(printWriter: PrintWriter) {
    println("wite start")
    printWriter.println("1")
    printWriter.println("2")
    printWriter.println("3")
    printWriter.println("4")
    printWriter.println("5")
    println("wite end")
  }

  def writeFile(file: File, write: PrintWriter => Unit) {
    // リソースを開く
    println("open file.")
    val writer = new PrintWriter(file)
    try {
      // 第二引数の関数にリソースを貸し出す。
      write(writer)
    } finally {
      // 最後にリソースを閉じる
      println("close file.")
      writer.close();
    }
  }

実行結果

ファイルオープン→書き込み→ファイルクローズの順に処理が行われていることがわかる。
open file.
wite start
wite end
close file.