Scala设计模式:借贷模式(Loan Pattern)

借贷模式(Loan Pattern)正如其名,就是把一个“资源”借出去给别人用,而自己负责资源的回收。python中的with语句就是这个模式的一个实现。Scala中虽然没有直接提供with语句,但借助其完善的类型系统和对函数式的支持,我们可以自己实现一个。

借贷模式有什么用?

使用“资源”时,比如Flie、Stream等,一定要记得在用完时close它们。使用借贷模式的一大好处就是,对于使用者不用再关心close资源这件事了,模式会自动帮你把他们关掉。

借贷模式怎么做?

利用Scala中的结构类型,可以实现“借贷模式”(完整代码可以看这里):

object using {
  def apply[R <: {def close() : Unit}, T](resource: => R)(f: R => T): T = {
    val source = Option(resource)
    try {
      f(source.get)
    } finally {
      for (s <- source)
        s.close()
    }
  }
}

使用方法示例如下:

using(new File()) { file =>
  println(file.getName)
}

附:结构类型(Structural Types)

[R <: {def close() : Unit}, T]

这段代码中的{def close() : Unit}实际上就是定义了一个结构类型。结构类型是Scala强大类型系统中,可以实现类似“动态类型”效果的一个魔法。

鸭子测试
如果一个对象看起来像鸭子,游泳像鸭子,叫声像鸭子,那么它可能就是只鸭子。我们就可以暂时把这个对象当做鸭子来用。

如上的定义中,只要类中有一个返回Unitclose()方法,都被认为是这个结构类型的子类,都满足R <: {def close() : Unit}这个约束。这样,我们定义的这个using()就可以支持各种各样资源的类型,只要它有close()方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 戏路如流水,从始至终,点滴不漏。一路百折千回,本性未变,终归大海。一步一戏,一转身一变脸,扑朔迷离。真心自然流露,...
    刘光聪阅读 2,044评论 3 13
  • 操作符重载? 举个例子[P60]1 + 2 中的 +操作符是一个方法。 首先,在 Scala 中,万物皆对象,包括...
    云之外阅读 518评论 0 1
  • 1.1. 什么是Scala Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特...
    文子轩阅读 1,556评论 1 3
  • 在抉择的哪一刻,成败实已露出端倪。 Scala拥有两种参数传递的方式:Call-by-Value(按值传递)与Ca...
    刘光聪阅读 17,315评论 2 18
  • 那天和他正面交锋我已记不得是第几次了,只记得他情绪十分激动对着我大吼大叫,往事电影一样的回放,电视一拳砸的粉碎,没...
    桉然阅读 73评论 0 0