2016-09-09 1 views
0

scala에 일반적인 유틸리티가있어 특정 코드 로직 n 번을 다시 시도합니다. Scala에서Java에서 Scala 객체로 코드 블록을 전달합니다.

RetryCode.scala

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

시험 단위 :

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

내가

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

가 어떻게를 수행 Java 프로그램에이 기능을 확장하고 싶습니다 01 블록을 보낸다.코드에서 RetryCode의 개체는 Scala입니까?

+0

Scala 클래스에서 Java 클래스의 인스턴스를 만드시겠습니까? 루프 내에서'myMethod'를 호출합니까? –

+0

불행하게도 Scala 객체는 Scala 코드 기반의 다른 곳에서 자주 사용되므로 옵션이 아닙니다. – AngryPanda

+0

그렇지 않습니다. 당신은 람다 (lambda) 나 인터페이스 (interface)로 무엇인가를합니다. –

답변

0

자바가 보는 retry의 서명은 <T> T retry(int timesRetry, scala.Function0<T> block)입니다. 따라서 Function0을 인스턴스화해야하지만 Java에서 직접 확장하면 작동하지 않습니다. 대신 당신은

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

(내가 제대로 기억하고 정적 방법은 RetryCode에 생성되는 적어도 경우)

를 원한다.

일반적으로 Scala API가 Java에서 합리적으로 호출 할 수 있다고 가정 할 수는 없습니다. Scala의 래퍼를 작성해야 할 수도 있습니다.

+0

여러 가지 인수로 복잡해지기 때문에 상황에 대해 확실치 않지만 노력에는 +1이 필요합니다. – AngryPanda

0

Java 7 프로그램을 Scala에 다시 작성했습니다.

관련 문제