【问题标题】:Java 7 style automatic resource management for ScalaScala 的 Java 7 风格自动资源管理
【发布时间】:2011-11-18 15:01:52
【问题描述】:

Java 7 引入了自动资源管理:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  return br.readLine();
}

这适用于任何实现java.lang.AutoClosable 的类。

我知道有几个在 Scala 中进行自动资源管理的示例,包括 Martin Odersky 演示的一个示例。

有没有计划在 Scala 中添加语言级别的资源管理,类似于 Java 的try(...) { }

【问题讨论】:

  • 我认为 [scala-language] 邮件列表更适合提出这个问题。
  • 我认为如果它被添加,那么不是作为语言功能,而是作为标准库的一部分。
  • 不会添加任何语言级别的功能,因为使用现有的语言功能很容易做到这一点,根据下面的答案。
  • 我想我应该修改我的问题,询问是否有计划将模式添加到标准库中。它是语言还是标准库的一部分对我来说并不重要,只要它在不使用外部资源的情况下可用。编写一个包含 37 个 Maven 依赖项的 1 页实用程序似乎很愚蠢 :-)。
  • 我真的应该开始使用它了。我错过了 C# 的 Disposable 模式好久了。

标签: java scala


【解决方案1】:

在 scala 中,这可以作为库添加。例如来自 jsuereth 的 scala-arm (https://github.com/jsuereth/scala-arm):

命令式:

// Copy input into output.
for(input <- managed(new java.io.FileInputStream("test.txt"); 
    output <- managed(new java.io.FileOutputStream("test2.txt")) {
  val buffer = new Array[Byte](512)
  while(input.read(buffer) != -1) {
    output.write(buffer);
  }
}

一元风格

val first_ten_bytes = managed(new FileInputStream("test.txt")) map { 
   input =>
     val buffer = new Array[Byte](10)
     input.read(buffer)
     buffer
}

在 github 页面上有更多示例

【讨论】:

    【解决方案2】:

    我不知道 Scala 中是否有专门为此设计的 Trait,但这里有一个在 Java Closable 上使用贷款模式的示例:

    http://whileonefork.blogspot.com/2011/03/c-using-is-loan-pattern-in-scala.html

    编辑

    您甚至可以通过执行以下操作来制作更通用的借用工具:

    https://stackoverflow.com/questions/5945904/what-are-your-most-useful-own-library-extensions/5946514#5946514

    【讨论】:

    • hehe Thomas ;) ... @Ralph 我刚刚添加了一个非常通用的 JPPelet 示例的链接
    【解决方案3】:

    Scala 规范非常单薄,因为几乎所有可以通过标准库实现的东西都是。因此没有真正需要在语言本身中添加 ARM。

    到目前为止,Scala 还没有真正的 IO API(默认使用 Java IO API)。未来的 Scala IO API 很可能会包含某种形式的 ARM。例如,scala-io 拥有 ARM。

    【讨论】:

      【解决方案4】:

      更好的文件中包含轻量级(10 行代码)ARM。见:https://github.com/pathikrit/better-files#lightweight-arm

      import better.files._
      for {
        in <- inputStream.autoClosed
        out <- outputStream.autoClosed
      } in.pipeTo(out)
      // The input and output streams are auto-closed once out of scope
      

      【讨论】:

        猜你喜欢
        • 2013-04-24
        • 2012-03-04
        • 2011-01-13
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多