Скала синтаксический сахар с шаблоном слушателя Java - PullRequest
4 голосов
/ 11 февраля 2011

Я должен использовать Java-код в моем проекте Scala. Код Java поощряет использование шаблона слушателя. Код выглядит примерно так:

 asyncHttpClient.prepareGet("http://www.ning.com/ ").execute(new AsyncCompletionHandler<Response>(){

    @Override
    public Response onCompleted(Response response) throws Exception{
        // Do something with the Response
        // ...
        return response;
    }

    @Override
    public void onThrowable(Throwable t){
        // Something wrong happened.
    }
});

Мне интересно, можно ли использовать что-нибудь лучше в scala с этим кодом. Я знаю, что есть статья, написанная Мартином Одерским, в которой говорится, что наблюдатель плох, но я не углубился в это дело. Спасибо

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011

Если вы не можете изменить сигнатуру вашего execute метода, вы можете написать удобный метод для упрощения создания обратного вызова:

def async(f: Response => Response)(handler: Throwable => Unit) =
   new AsyncCompletionHandler[Response]() {
      @throws(classOf[Exception])
      override def onCompleted(response: Response): Response = 
         f(response)

      override def onThrowable(t: Throwable) = handler(t)
   }

Затем вы можете написать свой код как

 asyncHttpClient.prepareGet("http://www.ning.com/ ").execute(async {
    response => // do something with response
 } { 
    caught => // handle failure
 }
2 голосов
/ 11 февраля 2011
import scala.actors.Futures.future
def asyncDiv(n: Int, d: Int) = future { try { Left(n / d) } catch { case ex => Right(ex) } }

Пример:

scala> asyncDiv(5, 2)
res9: scala.actors.Future[Product with Serializable with Either[Int,java.lang.Throwable]] = <function0>

scala> res9()
res10: Product with Serializable with Either[Int,java.lang.Throwable] = Left(2)

scala> asyncDiv(3, 0)
res11: scala.actors.Future[Product with Serializable with Either[Int,java.lang.Throwable]] = <function0>

scala> res11()
res12: Product with Serializable with Either[Int,java.lang.Throwable] = Right(java.lang.ArithmeticException: / by zero)
...