是否存在不应在常规 try 块上使用 try-with-resources 的情况?
Posted
技术标签:
【中文标题】是否存在不应在常规 try 块上使用 try-with-resources 的情况?【英文标题】:Are there instances in which try-with-resources shouldn't be used over the regular try block? 【发布时间】:2014-08-22 08:37:15 【问题描述】:例如,如果需要在不同对象中传递资源实例怎么办?
既然 try-with-resource 的设计(正确地)是为了限制其成员的范围而构建的,那么有人会如何处理这种设计问题?
仍然使用 try-with-resources 并不断地传递实例? 使用常规的 try-catch-finally 块并将成员保持在其范围之外?
【问题讨论】:
这听起来有点抽象。您能否添加一些示例代码来概述不同选项的含义? 【参考方案1】:来自文档:
" 资源是程序结束后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。任何实现@的对象987654321@,包括所有实现java.io.Closeable
的对象,都可以作为资源使用。”
如果您想要一个始终需要资源的设计,请不要选择try-with-resources
,而是将资源保留在外部并在简单的try-catch
内部使用它。
但是如果你使用这个策略,请确保你做了必要的CLEANUP
此外,如果您使用传统的 try-catch
,您可能需要更频繁地编写嵌套的 try-catch 块。(关闭资源也会引发 Exception
)
【讨论】:
【参考方案2】:正如雷所说,这个问题有点抽象。我想到了两种情况:
对资源的本地引用:使用 try-with-resources 当然,您可以将资源传递给 try 块内的其他方法。 引用资源的成员变量:考虑实现 AutoCloseable,以便您的类本身的实例可以在 try-with-resources 块中使用。【讨论】:
【参考方案3】:不应该总是使用资源尝试,并且必须在创建可关闭对象时使用。即使你有一个传入的对象,这意味着调用者必须有一个 try-catch 块,它在其中调用你的方法。然后外部调用者的 try-catch 将关闭该对象。
【讨论】:
以上是关于是否存在不应在常规 try 块上使用 try-with-resources 的情况?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Enzyme 测试 React 组件时出错:'不变违规:您不应在 <Router> 外使用 <Link>'