我想在一个类实例存在的整个过程中打开一个FileWriter.所以我需要在析构函数中关闭它.但是如何在Scala中指定析构函数?
Kri*_*mbe 10
您可能有兴趣查看Josh Suereth的scala-arm项目,该项目提供了基于monadic和delimited-continuation的资源管理,仅用于此使用源:http://github.com/jsuereth/scala-arm
如果你真的认为你需要一个析构函数(也就是因为你认为你需要创建对象然后把它交给它再也看不到它)我建议你重新考虑你的应用程序架构......根本没有办法让这在JVM上可靠地工作.
这是我经常使用的一种方便的实用方法.我发现它很好地整理了我的代码.
def closer [T, C <: Closeable] (c : C) (f : C => T) : T =
try f (c)
finally c.close
Run Code Online (Sandbox Code Playgroud)
使用它很简单.下面的示例使用来自URLConnection的输入流.您可以创建任何任意流,而不是connection.getInputStream(或者更常见的是,任何任意可关闭对象).
val bytes = closer (connection.getInputStream) { istream =>
val bytes = new ByteArrayOutputStream ()
val buffer : Array [Byte] = new Array (1024)
Iterator.continually (istream read buffer).takeWhile (_ > 0).foreach (bytes write (buffer, 0, _))
bytes.toByteArray
}
Run Code Online (Sandbox Code Playgroud)
此版本将使用close方法对任何内容进行操作(无需实现Closeable或其他任何内容).
def autoClose[R <: {def close()}, T](resource: R)(use: R => T): T = {
try use(resource)
// Don't want an NPE here masking an exception from use.
finally Option(resource).foreach(_.close())
}
Run Code Online (Sandbox Code Playgroud)
这里有一些隐式的类来完成这项工作.
implicit class AutoCloseBracket[R <: Closeable](resource: R) {
def autoClose[V](use: R => V): V = try use(resource) finally resource.close()
}
implicit class AutoCloseableBracket[R <: AutoCloseable](resource: R) {
def autoClose[V](use: R => V): V = try use(resource) finally resource.close()
}
Run Code Online (Sandbox Code Playgroud)
Scala没有析构函数.它有终结器,如Java,但它们根本不是一回事.using在Scala中还有一个有趣的博客系列模拟C#的关键字:
| 归档时间: |
|
| 查看次数: |
13804 次 |
| 最近记录: |