Pregunta ¿Cómo se pasa un bloque ejecutable como parámetro en Java?


¿Hay alguna forma de pasar un bloque ejecutable como parámetro a un método estático? ¿Es posible? Por ejemplo, tengo este método

public static void someMethod(boolean flag, Block block1, BLock block2) {
    //some other code
    if(flag)
        block1.execute();
    else block2.execute();
    //some other code
}

o algo así. En realidad es más complicado que esto, simplemente simplifiqué la pregunta. Estoy tratando de refactorizar mi proyecto y creé una clase de utilidad genérica que contiene métodos estáticos que usan mis clases.


17
2017-09-03 01:32


origen


Respuestas:


Puedes usar Runnable objetos:

public static void someMethod(boolean flag, Runnable block1, Runnable block2) {
    //some other code
    if(flag)
        block1.run();
    else block2.run();
    //some other code
}

Entonces puedes llamarlo con:

Runnable r1 = new Runnable() {
    @Override
    public void run() {
        . . .
    }
};
Runnable r2 = . . .
someMethod(flag, r1, r2);

EDITAR (lo siento, @Bohemio): en Java 8, el código de llamada puede simplificarse usando lambdas:

someMethod(flag, () -> { /* block 1 */ }, () -> { /* block 2 */ });

Aún declararías someMethod de la misma manera. La sintaxis lambda solo simplifica cómo crear y pasar el Runnables.


27
2017-09-03 01:38



Simplemente puede crear una interfaz y pasar objetos de las clases que implementan esa interfaz. Esto se conoce como el patrón de comando.

Por ejemplo, podrías tener:

public interface IBlock
{
   void execute();
}

y una clase de implementación:

public class Block implements IBlock
{
    public void execute()
    {
        // do something
    }
}

En Java 8 podrá pasar expresiones lambda como predicados y funciones que harán que el código sea un poco más limpio pero que esencialmente haga lo mismo.


-1
2017-09-03 01:49