Как передать исполняемый блок в качестве параметра в 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 вы сможете передавать лямбда-выражения, такие как предикаты и функции, которые сделают код немного чистым, но по сути делают то же самое.