2011-02-11 10 views
4

私はスカラプロジェクトでJavaコードを使用する必要があります。 Javaコードは、リスナーパターンの使用を推奨します。コードは次のようなものです:スカラ構文砂糖と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. 
    } 
}); 

このコードでは、より良いスケーラを使うことができるかどうかは疑問です。私は、オブザーバーのパターンが悪いと言っているマーティン・オデスキーが書いた論文があることを知っていますが、私はその問題に深く関わっていません。 おかげ

答えて

3

、あなたはコールバックの作成を簡素化するために便利なメソッドを書くことができます:

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 
} 
+0

これは良い提案です。ありがとう – Matroska

2
import scala.actors.Futures.future 
def asyncDiv(n: Int, d: Int) = future { try { Left(n/d) } catch { case ex => Right(ex) } } 

例:あなたはexecuteメソッドのシグネチャを変更できない場合

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) 
+0

同じ行にすべてを書き込むのは慣用的なスケーラですか?それはとても簡単でシンプルなのでコンパクトさのためだけですか? –

+0

これは非常に興味深いようです。私はその話題について深く考えます。正直なところ、私は左のケースクラスはあまりよく分かりません。 – Matroska

+0

[OK]を読んだ後、http://www.scala-lang.org/api/2.7.7/scala/Either.html今私はあなたに従っています。しかし、このコードは、Javaリスナーパターンの権利と混合することはできませんでしたか?ありがとう – Matroska

関連する問題