【问题标题】:How do you pass an executable block as a parameter in Java?如何在 Java 中将可执行块作为参数传递?
【发布时间】:2021-05-18 23:15:20
【问题描述】:

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

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

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

【问题讨论】:

  • 查看命令模式。
  • 我认为 Java 的下一个版本有类似的东西,但是现在,它没有语言支持,你必须将你的逻辑包装在一个类中,就像你如何在 Swing 应用程序中进行事件处理一样和东西。
  • 使用 Runnable 或 Future 或您选择的界面。
  • 在将代码重构为静态方法之前,您可能希望阅读此内容。 misko.hevery.com/2008/12/15/…
  • 仅供参考,Java 8 增加了对lambda expressions 的支持,它可以与RunnableCallable 等单方法接口一起使用,以使传递“代码块”的语法非常简洁。

标签: java refactoring


【解决方案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);

编辑(抱歉,@Bohemian):在 Java 8 中,调用代码可以使用 lambdas 进行简化:

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

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

【讨论】:

  • 如果 .run() 将从工作线程中调用,那么 run 方法中的代码也会在工作线程上执行吗?怎么可能在主线程上执行?
  • @János - 要在主线程上运行,您必须使用Handler 并将Runnable 发布到它以由处理程序而不是工作线程代码运行。
【解决方案2】:

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

例如,您可以:

public interface IBlock
{
   void execute();
}

和一个实现类:

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

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

【讨论】:

  • 嗯......没有必要发明新的接口来做到这一点。使用Runnable
  • 使用可运行的声音真的不干净,只是我的观点,从未见过这样使用可运行的代码
  • @Seb - 它有什么不干净的地方? Runnable 正是为这种事情而设计的:传递一个可以稍后执行的“代码块”(在另一个线程上;在将来的某个时间;当满足某些条件时;等等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2018-05-17
  • 1970-01-01
  • 2011-09-25
  • 2017-04-13
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多