Как передать исполняемый блок в качестве параметра в Java?
Есть ли способ передать исполняемый блок в качестве параметра статическому методу? Это вообще возможно? Например, у меня есть этот метод
public static void someMethod(boolean flag, Block block1, BLock block2) {
//some other code
if(flag)
block1.execute();
else block2.execute();
//some other code
}
или что-то в этом роде. Это на самом деле более сложное, чем это, я просто упростил вопрос. Я пытаюсь реорганизовать мой проект, и я создал общий класс утилиты, содержащий статические методы, которые используют мои классы.
Ответы
Ответ 1
Вы можете использовать объекты Runnable
:
public static void someMethod(boolean flag, Runnable block1, Runnable block2) {
//some other code
if(flag)
block1.run();
else block2.run();
//some other code
}
Затем вы можете вызвать его с помощью:
Runnable r1 = new Runnable() {
@Override
public void run() {
. . .
}
};
Runnable r2 = . . .
someMethod(flag, r1, r2);
EDIT (извините, @Bohemian): в Java 8 код вызова можно упростить с помощью lambdas:
someMethod(flag, () -> { /* block 1 */ }, () -> { /* block 2 */ });
Вы все равно объявите someMethod
таким же образом. Синтаксис лямбда просто упрощает создание и передачу Runnable
s.
Ответ 2
Вы можете просто создать интерфейс и передать объекты из классов, реализующих этот интерфейс. Это называется шаблоном Command.
Например, вы могли бы:
public interface IBlock
{
void execute();
}
и реализующий класс:
public class Block implements IBlock
{
public void execute()
{
// do something
}
}
В Java 8 вы сможете передавать лямбда-выражения, такие как предикаты и функции, которые сделают код немного чистым, но по сути делают то же самое.