2016-10-03 4 views
-4

申し訳ありませんが、私は思っています。関数をjavaでパラメータとして渡して複数回実行する方法

私の目標は、パラメータとして渡しているメソッドを実行しようとすると「n」時間のループを繰り返すリトライ関数を作成することです。

この場合、関数 "myFunction()"を実行したいと思いますが、返される値がfalseで、戻り値がtrueになるまで実行したいことがあります。私はそれを実行したい方法です

public static void main (String [] args){ 
    boolean did work = retry (myFunction(),5) 
    if(didwork){ 
     System.out.println("I found my stuff"); 
    } else { 
     System.out.println("I didn't found my stuff"); 
    } 
} 

public boolean retry (Function function, int loopTry){ 
    boolean success = false; 
    for(int i=0 ; i<loopTry ; i++){ 
     success = function.run(); 
     if(success){ 
      break; 
     } 
    } 
    return success; 
} 

public boolean myFunction(){ 
    boolean found = false; 
    //do stuff 
    if(stuff){ 
     found = true; 
    } 
    return found; 
} 

が、私はそれは不可能だということを知っている(少なくともJavaの7多分8中に)

は、私が作成することを示唆しているいくつかの答えを見てきました特定の関数などのオブジェクト...しかし、再試行したいメソッドでないオブジェクトをリメイクする必要があるので、リトライ関数は一般的になりません。

私はそれを行うための「クリーンな」方法(Java 8でも)があるかどうかを知りたいですか?

あなたは

+1

をMyFunctionのとのインタフェースを作成します。次に、あなたが望むもので1つのクラスを実装します。関数を呼び出すには、このクラスのインスタンスを 'retry'に渡す必要があります。 – AxelH

+1

あなたの関数のようなものは入力がなく、出力を持っています。 Java 8の 'Supplier'インタフェースを見てください。https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html – dty

+0

' retry'は 'Function'オブジェクトのパラメータを受け取ります'ブール値ではありません。 'このコードはコンパイルされますか? –

答えて

1

あなたはここにreflectionを試みることができる:

例えば:

public static void main(String[] args) throws NoSuchMethodException, SecurityException, IllegalAccessException, 
      IllegalArgumentException, InvocationTargetException { 

    Method method = Test.class.getMethod("myFunction"); 

    boolean didwork = retry(method, 5); 
    if (didwork) { 
     System.out.println("I found my stuff"); 
    } else { 
     System.out.println("I didn't found my stuff"); 
    } 

} 

public static boolean retry(Method method, int loopTry) 
     throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { 

    boolean success = false; 
    for (int i = 0; i < loopTry; i++) { 
    success = (Boolean) method.invoke(null); 
    if (success) { 
     break; 
    } 
    } 
    return success; 
} 

public static boolean myFunction() { 
    boolean found = false; 

    //do stuff 
    if(stuff){ 
    found = true; 
    } 

    return found; 
} 
+0

回答ありがとうございます。私はこれらを静的にしておかなくてはならず、オブジェクトのインスタンス(この場合はTest)をパラメータとして呼び出して動作させなければならなかった – user3718160

0

あなただけの関数内のMyFunctionに()が「再試行」をwhileループを追加することができますありがとうございます。これはちょうど1つの追加的な行になります。最大試行回数をnと定義する場合、最大2〜3回。 2番目のケースでは、真になるまで試行するか、試行に達した場合に試行するかのいずれかの効果を再現しました。

+0

事は私がループをしたくないということです。それぞれの試行と複数の試行の間に複数のものを入れたいです複数の機能に対してこのリトライ機能を使用してください。 この「再試行」機能を作成することで、それぞれの機能の中に複数のループが存在することを避けることができるかどうかは疑問です。 – user3718160

関連する問題