読者です 読者をやめる 読者になる 読者になる

GroovyのWritableインターフェースの存在意義

dev groovy

id:uehajさんの解説が分かりやすいです。
http://d.hatena.ne.jp/uehaj/20091019/1255925722
典型的な利用例としては、StreamingMarkupBuilderでのXML出力です。
XMLの出力ロジックをクロージャ(MarkupBuilderの記法)で構成し、StreamingMarkupBuilderのbind()メソッドの引数に指定してやると、bind()の結果としてクロージャによって表現されたXML文書ツリーの構造を出力するためのWritableを得ることができます。重要なのは、Writableを得た時点では実際の処理は行われておらず、Writable.writeTo(Writer out)で指定された出力先outが結果を要求した時点で必要なだけの処理を行うということです。
すなわち、Writableを利用することで、

  • 処理を先送りできる(遅延実行)
  • 処理をバッファリングできる(ストリーミング実行)

が実現できるということです。
ちなみに、XmlSlurper.parse()でXMLをパースするとGPathResultが得られますが、これはXML文書ツリーをトラバースするためのポインタ(イテレータ)のようなものと解釈すると理解しやすいです。なので、GPathResult経由で取り出したXMLを加工して出力するためには、StreamingMarkupBuilderにbindしてやる必要があるのです。
うまくまとまりませんが、ひとまずメモということで。