我正在与一家使用Java的Struts生产Web应用程序的公司合作。我最近一直在重构许多代码,以整理系统。我一直使用的一种技术是移动流的关闭语句 最后 实用程序类方法的块。实用程序类是静态的,并且针对各种流的流有了密切的方法。通过进行此类重构,我每次需要关闭流的流程时保存5行代码,这使某些类中的代码减少了600行,使其非常有利。但是,我担心这样做,如果投入生产,可能会对这些方法引起争议。

我只在多线程编程中遇到争论的概念,这就是为什么我不确定这是否会在这些情况下引起问题。

这可能吗?还是仅仅是我对争论,静态方法,Web应用程序等的误解?

预先感谢Alexei Blue。

有帮助吗?

解决方案

除非静态方法仅在其参数上运行,并且您不会尝试多次同时关闭相同的流,您应该可以。

通常可以同时执行方法。同步将始终在对象上起作用,因此,如果您在这些方法中使用的对象完全不同,则不应发生争执。

其他提示

在同一范围内关闭所有打开文件处理程序是最好的做法。例如,当一种方法中打开文件输出流时,也应使用该方法将其关闭。这也可以防止大多数并发问题(但并非总是如此)。但是,在这种情况下,没有这样做的许多例外,但是跟踪和关闭所有文件处理程序将更加困难。

仅供参考,存在一种闭合方法,该方法确实可以在Apache Common IO中执行您描述的内容, ioutils. 。这是一个受欢迎的库,您可能会考虑使用。

这是一个普遍的做法,例如,查看番石榴的闭合课。顺便说一句,您只需要一种方法即可在Java中关闭任何内容:

public static void closeQuietly(Closeable closeable) {
  if (closeable != null) {
    try {
      closeable.close();
    } catch (RuntimeException re) {
      // Do something or ignore...
    }
  }
}

随着所有流和读者实现可封闭的接口,该方法应足以满足您的所有需求。

通常,这不会引起争论,除非您尝试从Say-a thead-a中的流中读取螺纹-B的关闭流。但是,如果真是这样,那么无论有没有这种重构,您都会有这种争论。仅此重构将不会引入任何 额外的 争论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top