Is there a way to pass an executable block as a parameter to a static method? Is it possible at all? For example I have this method
public static void someMethod(boolean flag, Block block1, BLock block2) {
//some other code
if(flag)
block1.execute();
else block2.execute();
//some other code
}
or something like that. It's actually more complicated than this, I just simplified the question. I am trying to refactor my project and I created a generic utility class that contains static methods that my classes use.
You can use Runnable
objects:
public static void someMethod(boolean flag, Runnable block1, Runnable block2) {
//some other code
if(flag)
block1.run();
else block2.run();
//some other code
}
Then you can call it with:
Runnable r1 = new Runnable() {
@Override
public void run() {
. . .
}
};
Runnable r2 = . . .
someMethod(flag, r1, r2);
EDIT (sorry, @Bohemian): in Java 8, the calling code can be simplified using lambdas:
someMethod(flag, () -> { /* block 1 */ }, () -> { /* block 2 */ });
You'd still declare someMethod
the same way. The lambda syntax just simplifies how to create and pass the Runnable
s.
You can simply create an interface and pass objects from classes that implement that interface. This is known as the Command pattern.
For example, you could have:
public interface IBlock
{
void execute();
}
and an implementing class:
public class Block implements IBlock
{
public void execute()
{
// do something
}
}
In Java 8 you will be able to pass lambda expressions such as predicates and functions which will make the code a little cleaner but essentially do the same thing.