返回介绍

1.10 贷出资源模式

发布于 2025-01-04 00:44:54 字数 1733 浏览 0 评论 0 收藏 0

贷出资源模式(Loan my Resource) 用于确保资源一旦超出范围后,就能得到处置。

许多 Groovy 的辅助方法都内建有这种模式。如果需要处理 Groovy 支持范围之外的资源,就应该考虑使用这一模式。

1.10.1 范例

下面这个范例代码用于处理文件。首先写入一些代码,然后打印该文件的尺寸:

def f = new File('junk.txt')
f.withPrintWriter { pw ->
  pw.println(new Date())
  pw.println(this.class.name)
}
println f.size()
// => 42

下面读取文件内容,每次读取并打印一行内容。

f.eachLine { line ->
  println line
}
// =>
// Mon Jun 18 22:38:17 EST 2007
// RunPattern

注意,Groovy 其实在幕后使用了 Java 中常见的 ReaderPrintWriter 对象,开发者不用担心如何显式地创建或关闭这些资源。内建的 Groovy 方法向闭包代码贷出相应的 reader 或 writer 对象,然后再进行自我整理,因而无需进行任何额外的操作。

但是,相对于使用 Groovy 内建机制所达成的结果,你可能更希望实现一些稍微不同的结果。所以你应该考虑在你自己的资源处理操作中使用该模式。

下面来考虑如何处理文件中每行中的单词列表。可以使用 Groovy 内建的函数来实现,但请忍耐一下,假设我们可以自己来处理一些资源。在不使用该模式的情况下进行编码:

def reader = f.newReader()
reader.splitEachLine(' ') { wordList ->
  println wordList
}
reader.close()
// =>
// [ "Mon", "Jun", "18", "22:38:17", "EST", "2007" ]
// [ "RunPattern" ]

注意在代码中我们显式地调用了 close() 。假如我们没有正确地编码(这里没有用 try …​ finally 代码块包围代码),就会有将文件处理公开的危险性。

下面使用贷出模式,首先编写一个辅助方法:

def withListOfWordsForEachLine(File f, Closure c) {
  def r = f.newReader()
  try {
    r.splitEachLine(' ', c)
  } finally {
    r?.close()
  }
}

然后重写代码,如下所示:

withListOfWordsForEachLine(f) { wordList ->
  println wordList
}
// =>
// [ "Mon", "Jun", "18", "22:38:17", "EST", "2007" ]
// [ "RunPattern" ]

它显得更为简洁,去除了显式的 close() 。我们可以在这样一个单一位置处,使用适宜级别的测试或审查来确保没有任何问题。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文