|
|
1
74
以下是我对备选方案的看法: 1)
对我来说,15年前从传统C++来到Java的最好的事情就是你可以信任你的程序。即使事情陷入困境,并且经常出错,我也希望代码的其余部分保持最佳行为,散发出玫瑰的香味。事实上,
还有“毁灭”。如果存在错误条件,则可能不希望将垃圾刷新到需要删除的文件(未显示该文件的代码)。当然,删除文件也是另一个有趣的错误处理操作。
一般来说你想要
2)
我们仍在隐式finally块中刷新(现在重复
3)
这里有个虫子。应该是:
实际上,一些实现糟糕的装饰器是资源,需要可靠地关闭。此外,有些流可能需要以特定的方式关闭(可能它们正在进行压缩,需要写入位才能完成,而不能只是刷新所有流。 判决虽然3是一个技术上优越的解决方案,但软件开发的原因使2成为更好的选择。然而,尝试使用资源仍然是一个不足的解决方案,您应该坚持 Execute Around idiom ,它应该在Java SE 8中具有更清晰的语法。 |
|
|
2
19
第一种风格是
suggested by Oracle
.
主要是因为它可能发生在一个线程中,线程死了,但程序仍在继续——比如说,有一个临时内存中断,时间不足以严重损害程序的其余部分。不过,这是一个非常棘手的问题,如果这种情况经常发生,导致资源泄漏成为一个问题,那么使用资源的尝试是您遇到的问题中最少的一个。 |
|
|
3
5
选项4 将资源更改为可关闭,如果可以,则不可自动关闭。构造函数可以被链接这一事实意味着它并非闻所未闻地要关闭两次资源。(这在ARM之前也是正确的。)下面将详细介绍。 选择5 不要非常小心地使用arm和代码来确保close()不会被调用两次! 选项6 不要使用arm,在try/catch中使用finally close()调用。 为什么我不认为这个问题是手臂特有的 在所有这些示例中,finally close()调用应该在catch块中。为可读性而忽略。 不好,因为FW可以关闭两次。(这对文件编写者来说很好,但在您的假设示例中却不行):
不好,因为如果构造bufferedwriter时出现异常,则fw不会关闭。(同样,不可能发生,但在您的假设示例中):
|
|
|
4
3
我只是想根据珍妮·博雅斯基的建议,不使用ARM,但要确保文件编写器总是关闭一次。别以为这里有什么问题…
我想既然arm只是语法糖,我们不能总是用它来替换finally块。就像我们不能总是使用for-each循环来做迭代器可能做的事情一样。 |
|
|
5
3
同意前面的评论:最简单的是
(2)
使用
或者,您可以使用静态工厂方法手动创建链接资源;这将封装链,并在链部分失败时处理清除:
然后可以在try with resources子句中将其用作单个资源:
复杂性来自于处理多个异常;否则它只是“目前为止获得的接近资源”。一个常见的做法似乎是首先初始化保存资源的对象的变量
你大概可以这样做:
同样,你可以连锁三个资源,等等。 撇开数学不谈,您甚至可以通过一次链接两个资源来链接三次,这将是关联的,这意味着您在成功时将获得相同的对象(因为构造函数是关联的),如果任何构造函数中有失败,则会得到相同的异常。假设您添加了 S 到上面的链子(所以你从 V 以一个 S ,通过应用 U , T 和 S 反过来,如果你第一次锁链 S 和 T 然后 U ,对应于 (ST)U ,或者如果你第一次锁链 T 和 U 然后 S ,对应于 S(TU) . 不过,在单个工厂函数中写出一个显式的三重链会更清楚。 |
|
|
6
2
由于资源是嵌套的,因此try with子句也应该是:
|
|
|
7
0
我会说不要用手臂,继续靠近。使用类似的方法,
你也应该考虑打电话给
|
|
|
8
0
我的解决方案是进行“提取方法”重构,如下所示:
或
对于类库设计器,我建议他们扩展
对于语言设计者来说,经验是添加一个新特性可能意味着添加许多其他特性。在这个Java案例中,显然ARM功能将更好地使用资源所有权转移机制。 更新
原来上面的代码要求
如评论所建议,如果
再次更新
以上更新使
为了解决这个问题,我们需要一个
|
|
|
user29759326 · 如何返回递归函数中的最后一个值? 1 年前 |
|
|
malife89 · 将java中的字符串读取为正确的日期格式 1 年前 |
|
|
Tim · 在java中,有没有更快的方法将字节数组写入文件? 1 年前 |
|
|
rudraraj · java中未声明最终变量 1 年前 |
|
|
Bala Ji · 以下BFS的实施效率如何? 1 年前 |