1. ホーム
  2. java

[解決済み] Execute Around」イディオムとは何ですか?

2022-04-26 09:14:20

質問

よく耳にする "Execute Around" というイディオム(またはそれに類するもの)は何でしょうか? なぜそれを使うのでしょうか、またなぜ使いたくないのでしょうか?

どのように解決するのですか?

基本的には、リソースの確保や後始末など、必ず必要なことを行うメソッドを書いて、呼び出し側に"リソースで何をしたいのか"を渡すパターンです。例えば

public interface InputStreamAction
{
    void useStream(InputStream stream) throws IOException;
}

// Somewhere else    

public void executeWithFile(String filename, InputStreamAction action)
    throws IOException
{
    InputStream stream = new FileInputStream(filename);
    try {
        action.useStream(stream);
    } finally {
        stream.close();
    }
}

// Calling it
executeWithFile("filename.txt", new InputStreamAction()
{
    public void useStream(InputStream stream) throws IOException
    {
        // Code to use the stream goes here
    }
});

// Calling it with Java 8 Lambda Expression:
executeWithFile("filename.txt", s -> System.out.println(s.read()));

// Or with Java 8 Method reference:
executeWithFile("filename.txt", ClassName::methodName);

呼び出し側のコードは、オープン/クリーンアップ側について心配する必要はありません。 executeWithFile .

Javaではクロージャの文字数が多くて正直苦痛でしたが、Java 8からはラムダ式が他の多くの言語と同様に実装できるようになり(例:C#のラムダ式、Groovy)、この特殊ケースはJava 7以降、以下のように処理されます。 try-with-resourcesAutoClosable ストリームを使用します。

典型的な例として、quot;allocate and clean-up" が挙げられますが、他にもトランザクション処理、ロギング、より多くの特権を持つコードの実行など、たくさんの例が考えられます。基本的には テンプレートメソッドパターン が、継承がない。