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);

EDIT(申し訳ありませんが、@Bohemian):Java 8では、ラムダを使用して呼び出しコードを簡素化できます:

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

あなたはまだsomeMethod同じ方法で宣言します。ラムダ構文は、s を作成して渡す方法を単純化するだけRunnableです。

于 2013-09-03T01:38:34.487 に答える
0

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

たとえば、次のようにすることができます。

public interface IBlock
{
   void execute();
}

および実装クラス:

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

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

于 2013-09-03T01:49:21.130 に答える