[解決済み] 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-resources
と
AutoClosable
ストリームを使用します。
典型的な例として、quot;allocate and clean-up" が挙げられますが、他にもトランザクション処理、ロギング、より多くの特権を持つコードの実行など、たくさんの例が考えられます。基本的には テンプレートメソッドパターン が、継承がない。
関連
-
Java エラー報告 スレッド "main" での例外 java.util.NoSuchElementException
-
エラー java.util.NoSuchElementException
-
javaの模造品QQ WeChatのチャットルーム
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
Eclipse起動エラー:javaは起動したが、終了コード=1を返した(ネット上の様々な落とし穴)
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
[解決済み] 山積みされた靴下を効率よく組み合わせるには?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
プロローグでのコンテンツは禁止されています
-
プロジェクトの依存関係を解決できなかった 解決
-
Methodのinvokeメソッド実装のJavaリフレクション
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
javax.net.ssl.SSLException: 読み取りエラー: ssl=0xdeae5100: システムコール中の I/O エラー、接続 res