web-dev-qa-db-ja.com

Javaで実行可能ブロックをパラメーターとしてどのように渡しますか?

実行可能ブロックをパラメーターとして静的メソッドに渡す方法はありますか?それは可能ですか?たとえば、私はこの方法を持っています

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

またはそのようなもの。実際にはこれよりも複雑です。質問を単純化しただけです。プロジェクトをリファクタリングしようとしていますが、クラスが使用する静的メソッドを含む汎用ユーティリティクラスを作成しました。

23
Keale

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では、ラムダを使用して呼び出しコードを簡略化できます:

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

それでも同じ方法でsomeMethodを宣言します。ラムダ構文は、Runnablesを作成して渡す方法を単純化するだけです。

36
Ted Hopp

インターフェースを作成し、そのインターフェースを実装するクラスからオブジェクトを渡すだけです。これはコマンドパターンとして知られています。

たとえば、次のようになります。

public interface IBlock
{
   void execute();
}

および実装クラス:

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

Java 8では、述語や関数などのラムダ式を渡すことができます。これにより、コードが少しきれいになりますが、基本的に同じことが行われます。

0
user2741408