在Java中,如何将可执行块作为参数传递?

在Java中,如何将可执行块作为参数传递?,java,refactoring,Java,Refactoring,有没有办法将可执行块作为参数传递给静态方法?有可能吗?例如,我有这个方法 public static void someMethod(boolean flag, Block block1, BLock block2) { //some other code if(flag) block1.execute(); else block2.execute(); //some other code } 或者类似的。其实比这更复杂,我只是简化了问题。我正在

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

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

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

您可以使用
可运行的对象:

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
。lambda语法只是简化了如何创建和传递
Runnable
s。

您只需创建一个接口并从实现该接口的类传递对象。这就是所谓的命令模式

例如,您可以:

public interface IBlock
{
   void execute();
}
和一个实现类:

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

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

查看命令模式。我认为下一个版本的Java有类似的功能,但目前没有语言支持,您必须将逻辑封装在类中,例如如何在Swing应用程序中处理事件等。请使用Runnable或Future或您选择的接口。在将代码重构为静态方法之前,您可能希望阅读以下内容。仅供参考,Java 8增加了对的支持,它可以与单一方法接口(如
Runnable
Callable
)结合使用,以使传递“代码块”的语法非常简洁。。。没有必要发明新的接口来实现这一点。使用
Runnable
。使用Runnable听起来真的不干净,只是我的观点,从未见过使用Runnable的代码way@Seb-有什么不干净的
Runnable
就是为这类事情而设计的:传递一个“代码块”,以后可以执行(在另一个线程上;将来的某个时间;当满足某些条件时等等)。如果从工作线程调用
。run()
,那么运行中的代码方法也会在工作线程上执行?如何在主线程上执行?@János-要在主线程上运行,您必须使用
处理程序
,并将
可运行
发布到它,以便由处理程序而不是工作线程代码运行。