Comment detail

loan patternのサンプル (Nested Flatten)
Javaにはクロージャがないので、匿名クラスを使ってみました。まず、要件を以下と考えました。

・ブロックを抜ける時に強制的にリソースの解放を行う。
・リソースを使う箇所では解放を意識しない。

サンプルでは、mainメソッドの中身がリソースを使う箇所になります。匿名クラスなので構文的には複雑になっていますが、要件は満たしていると思います。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.io.*;

public class WithResource<T extends Closeable> {

    private T resource;
    
    public WithResource(T resource) {
        this.resource = resource;
    }
    
    public T get() {
        return resource;
    }

    public void using(Runnable f) throws IOException {
        try {
            f.run();
        } finally {
            resource.close();
        }
    }

    public static void main(String[] args) throws IOException {
        final WithResource<PrintWriter> wr = new WithResource<PrintWriter>(
                new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out))));
        wr.using(new Runnable() {
            public void run() {
                wr.get().print("この文字列はflushしないと書き出されない");
                wr.get().print("(closeし忘れは良くある間違い)。");
            }
        });
    }

}

Java版(#9162)をScalaに移植しました。 これはこれで味わい深いです。 ありがとうございました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Java版#9162を移植
import java.io._

case class WithResource[T<:Closeable]( resource:T ) {
    def using[F<:Runnable](f:F) : Unit= {
        try {
            f.run();
        } finally {
            resource.close();
        }
    }
}

object Main{
    def main(args:Array[String]) : Unit = {
        val wr = WithResource(  new PrintWriter(
                                new BufferedWriter(
                                new OutputStreamWriter(System.out))))
        wr.using(new Runnable{
                    override def run():Unit = {
                        wr.resource.print("この文字列はflushしないと書き出されない");
                        wr.resource.print("(closeし忘れは良くある間違い)。");
                    } } )
    }
}

Index

Feed

Other

Link

Pathtraq

loading...