文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
1.10 贷出资源模式
贷出资源模式(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 中常见的 Reader
和 PrintWriter
对象,开发者不用担心如何显式地创建或关闭这些资源。内建的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论