30

有没有办法将可执行块作为参数传递给静态方法?有可能吗?例如我有这个方法

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

或类似的东西。它实际上比这更复杂,我只是简化了这个问题。我正在尝试重构我的项目,并创建了一个通用实用程序类,其中包含我的类使用的静态方法。

4

2 回答 2

43

您可以使用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);

编辑(对不起,@Bohemian):在 Java 8 中,调用代码可以使用 lambdas 来简化:

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

你仍然会someMethod以同样的方式声明。lambda 语法只是简化了如何创建和传递Runnables。

于 2013-09-03T01:38:34.487 回答
0

您可以简单地创建一个接口并从实现该接口的类中传递对象。这被称为命令模式。

例如,您可以:

public interface IBlock
{
   void execute();
}

和一个实现类:

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

在 Java 8 中,您将能够传递 lambda 表达式,例如谓词和函数,这将使代码更简洁,但本质上是做同样的事情。

于 2013-09-03T01:49:21.130 回答