2015-08-13 23:54:40 +02:00
---
layout: pattern
title: Execute Around
folder: execute-around
2015-08-15 18:03:05 +02:00
permalink: /patterns/execute-around/
2019-12-13 21:09:28 +02:00
categories: Idiom
2021-05-19 10:49:05 -06:00
language: en
2015-12-28 15:52:44 +02:00
tags:
2019-12-13 21:09:28 +02:00
- Extensibility
2015-08-13 23:54:40 +02:00
---
2016-01-03 21:14:30 +01:00
## Intent
2020-08-29 20:26:37 +03:00
Execute Around idiom frees the user from certain actions that should always be executed before and
after the business method. A good example of this is resource allocation and deallocation leaving
the user to specify only what to do with the resource.
2020-07-18 17:43:12 +03:00
## Explanation
2022-01-10 13:34:19 +02:00
Real-world example
2020-07-18 17:43:12 +03:00
2022-01-10 13:34:19 +02:00
> A class needs to be provided for writing text strings to files. To make it easy for
> the user, the service class opens and closes the file automatically. The user only has to
2020-08-29 20:26:37 +03:00
> specify what is written into which file.
2020-07-18 17:43:12 +03:00
In plain words
> Execute Around idiom handles boilerplate code before and after business method.
[Stack Overflow ](https://stackoverflow.com/questions/341971/what-is-the-execute-around-idiom ) says
2020-08-29 20:26:37 +03:00
> Basically it's the pattern where you write a method to do things which are always required, e.g.
> resource allocation and clean-up, and make the caller pass in "what we want to do with the
> resource".
2020-07-18 17:43:12 +03:00
**Programmatic Example **
2022-01-10 13:34:19 +02:00
`SimpleFileWriter` class implements the Execute Around idiom. It takes `FileWriterAction` as a
constructor argument allowing the user to specify what gets written into the file.
2020-07-18 17:43:12 +03:00
``` java
@FunctionalInterface
public interface FileWriterAction {
void writeFile ( FileWriter writer ) throws IOException ;
}
2022-01-10 13:34:19 +02:00
@Slf4j
2020-07-18 17:43:12 +03:00
public class SimpleFileWriter {
2022-01-10 13:34:19 +02:00
public SimpleFileWriter ( String filename , FileWriterAction action ) throws IOException {
LOGGER . info ( " Opening the file " ) ;
try ( var writer = new FileWriter ( filename ) ) {
LOGGER . info ( " Executing the action " ) ;
action . writeFile ( writer ) ;
LOGGER . info ( " Closing the file " ) ;
}
2020-07-18 17:43:12 +03:00
}
}
```
2022-01-10 13:34:19 +02:00
The following code demonstrates how `SimpleFileWriter` is used. `Scanner` is used to print the file
contents after the writing finishes.
2020-07-18 17:43:12 +03:00
``` java
2022-01-10 13:34:19 +02:00
FileWriterAction writeHello = writer - > {
writer . write ( " Gandalf was here " ) ;
} ;
new SimpleFileWriter ( " testfile.txt " , writeHello ) ;
var scanner = new Scanner ( new File ( " testfile.txt " ) ) ;
while ( scanner . hasNextLine ( ) ) {
LOGGER . info ( scanner . nextLine ( ) ) ;
}
```
Here's the console output.
```
21:18:07.185 [main] INFO com.iluwatar.execute.around.SimpleFileWriter - Opening the file
21:18:07.188 [main] INFO com.iluwatar.execute.around.SimpleFileWriter - Executing the action
21:18:07.189 [main] INFO com.iluwatar.execute.around.SimpleFileWriter - Closing the file
21:18:07.199 [main] INFO com.iluwatar.execute.around.App - Gandalf was here
2020-07-18 17:43:12 +03:00
```
2015-08-13 23:54:40 +02:00
2019-12-07 20:01:13 +02:00
## Class diagram
2020-08-29 20:26:37 +03:00
2015-08-13 23:54:40 +02:00

2016-01-03 21:14:30 +01:00
## Applicability
2020-08-29 20:26:37 +03:00
2016-01-03 21:14:30 +01:00
Use the Execute Around idiom when
2015-08-13 23:54:40 +02:00
2022-01-10 13:34:19 +02:00
* An API requires methods to be called in pairs such as open/close or allocate/deallocate.
2016-01-27 12:55:59 +05:30
2016-02-02 17:31:12 +01:00
## Credits
2019-12-13 21:09:28 +02:00
2020-07-06 13:31:07 +03:00
* [Functional Programming in Java: Harnessing the Power of Java 8 Lambda Expressions ](https://www.amazon.com/gp/product/1937785467/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1937785467&linkCode=as2&tag=javadesignpat-20&linkId=7e4e2fb7a141631491534255252fd08b )