【发布时间】:2014-10-27 08:55:28
【问题描述】:
C# 有 using 和 IDisposable 接口。 Java 7+ 具有与try 和AutoCloseable 接口相同的功能。 Scala 允许您选择自己的实现来解决这个问题。
scala-arm 似乎是流行的选择,由 Typesafe 的一名员工维护。但是,对于这样一个简单的行为,它似乎非常复杂。澄清一下,使用说明很简单,但了解所有代码在内部是如何工作的却相当复杂。
我刚刚写了以下超级简单的ARM解决方案:
object SimpleARM {
def apply[T, Q](c: T {def close(): Unit})(f: (T) => Q): Q = {
try {
f(c)
} finally {
c.close()
}
}
}
- 像单臂这样的东西有什么好处吗?似乎所有额外的复杂性都应该带来额外的好处。
- 通常,与使用自定义代码相比,最好使用其他人支持的公共、开源库来实现通用行为。
- 谁能推荐任何改进?
- 这种简单的方法有什么限制吗?
【问题讨论】:
-
AFAIK,“c”的类型取决于反射,这在性能和使用重构或字节码混淆时可能会出现问题。相反,我会在这里简单地重用 java.lang.AutoCloseable 类型。
-
您的代码无法处理
c== null 情况。如果 close() 也抛出异常,也不清楚会抛出哪个异常。 -
因为我需要能够嵌套多个 java.lang.AutoCloseable 实例,每个实例都依赖于前一个成功实例化的实例,所以我终于找到了一个对我非常有用的模式。我把它写成类似 StackOverflow 问题的答案:stackoverflow.com/a/34277491/501113
-
@chaotic3quilibrium,我下面的答案包含一个超级简单的 Arm 系统,支持您描述的嵌套类型。
-
糟糕。这是我的答案的可点击链接(关于类似和相关的问题):stackoverflow.com/a/34277491/501113