2016-09-09 5 views
0

scalaの汎用ユーティリティを使用して、特定のコードロジックnを再試行します。私は私がどのようにJavaプログラムJavaのコードブロックをScalaオブジェクトに渡す

private void myMethod(int x) { 
    try { 
     // Code block to Retry 10 times 
     ... 
    } catch(Exception ex) { 
     System.out.println("Error: " + ex.getMessage()); 
    } 
} 

に、この機能を拡張したいと思います

class RetryCodeTest { 
    test("success on 1st retry") { 
     var i = 0 
     val result = retry(5) { 
      i = i + 1 
      i 
     } 
     assert(result==1) 
    } 
} 

RetryCode.scala

object RetryCode { 
    def retry[T](timesRetry: Int)(block: => T): T = { 
     def doBlock() = block 
     breakable { 
      for (i <- 0 until timesRetry) { 
       try { 
        ... 
        doBlock() 
       } catch { 
        ... 
       } 
      } 
     } 
    } 
} 

Scalaにおけるテスト・ユニット01のブロックを送信するコードをRetryCodeにコピーScalaのオブジェクトですか?

+0

ScalaクラスでJavaクラスのインスタンスを作成しますか?ループ内で 'myMethod'を呼び出しますか? –

+0

残念ながら、ScalaオブジェクトはScalaコードベースのどこにも頻繁に使用されるため、これはオプションではありません。 – AngryPanda

+0

あなたはそうではありません。あなたはラムダやインターフェイスで何かをします。 –

答えて

0

Javaが参照するretryの署名は<T> T retry(int timesRetry, scala.Function0<T> block)です。したがって、Function0をインスタンス化する必要がありますが、Javaで直接拡張することはできません。代わりに、あなたは(少なくとも私の記憶が正しけれと静的メソッドはRetryCodeに生成されている場合)

RetryCode.retry(10, new scala.runtime.AbstractFunction0<Integer> { 
    @Override 
    public Integer apply() { return something; } 
}); 

をしたいです。

一般に、Scala APIがJavaから適度に呼び出し可能であると仮定することはできません。 Scalaのラッパーを記述する必要があるかもしれません。

+0

複数の議論ですぐに複雑になってしまいますが、努力すれば+1になることは確かです! – AngryPanda

0

Java 7プログラムをScalaに書き換えました。

関連する問題