【问题标题】:Scala syntactic sugar with java listener pattern带有 Java 侦听器模式的 Scala 语法糖
【发布时间】:2011-02-11 00:31:47
【问题描述】:

我必须在我的 scala 项目中使用 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.
    }
});

我想知道是否可以通过这段代码在 scala 中使用更好的东西。我知道 Martin Odersky 写的一篇论文说观察者模式很糟糕,但我没有深入探讨这个问题。 谢谢

【问题讨论】:

    标签: java scala listener pojo


    【解决方案1】:

    如果您无法更改 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】:
      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)
      

      【讨论】:

      • 把这些都写在同一行是惯用的scala吗?或者它只是为了紧凑,因为它是如此简短和简单?
      • 这看起来很有趣。我将深入探讨这个话题。老实说,我不太了解 Left case 类。
      • 读完scala-lang.org/api/2.7.7/scala/Either.html之后好的,现在我关注你了。但是这段代码不能与 java 监听器模式混合,对吧?谢谢
      • @Matroska 我以为你想要一个替代方案。如果您绑定到该界面,那么这确实对您没有帮助。
      • @Ken 将简短的表达式保持在同一行是惯用的。由于try/catch是Scala中的一个表达式,而且它很短,所以通常放在同一行。最近通过if/else 获得支持的另一个替代方案是将每个替代方案保留在一行中。所以try { ... } 会在第二行,catch { ... } 会在第三行。
      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 2021-05-21
      • 2014-08-10
      • 1970-01-01
      • 2011-06-13
      相关资源
      最近更新 更多