[英]Force try-with-resources Java 7
我有一个实现AutoCloseable的类,旨在与Java 7的新try-with-resources构造一起使用。 但是,我无法找到一种方法来保证我的类的用户使用try-with-resources。 如果没有发生这种情况,那么我的班级将无法自行关闭,并且会发生不好的事情。 有没有办法 - 语言构造或其他 - 来强制执行此操作? 甚至能够检测我是否在try-with-resources块中以便我可以抛出异常(如果不是)会很好(尽管编译时构造会更好)。
谢谢!
不幸的是,没有办法保护自己免受用户愚蠢。
您可以实现finalize
方法来调用close
; 通过这种方式,您可以确保资源至少在对象被垃圾回收时关闭,即使您无法知道何时(或是否)发生这种情况。
如果您可以对项目的使用方式进行限制,您可以使用面向方面的编程来强制执行某些策略,但之后您就不再使用Java了。
如果你真的关心资源管理,那么使用回调习语是最安全的方法。 您不公开集合,而是公开允许最终用户处理集合中项目的API:
public interface Callback<T> {
void handle(T item);
}
public class SuperVitalVault {
public void all(Callback<Precious> callback) {
try (...) {
for (Precious i : ...) {
callback.handle(i);
}
}
}
}
如果要支持提前退出,可以更改Callback.handle(T)
以返回boolean
:
try (...) {
for (Precious i : ...) {
if (callback.handle(i)) break;
}
}
如果你想远离定义自己的回调接口,你可以使用Guava的Function<T, Boolean>
或Predicate<T>
,但请注意它违反了Guava建立的语义:
通常期望函数实例是引用透明的 - 没有副作用 - 并且与equals一致,即a.equals(b)意味着function.apply(a).equals(function.apply(b) )。
谓词的实例通常预期是无副作用的并且与equals一致。
不,没有办法,如果你继续打开文件或数据库连接并且你没有关闭它们会发生同样的坏事......
如果可以在一个方法调用的范围内使用和放弃敏感资源,则可以在每次调用api时打开/关闭,如果没有,则只需记录好行为。
你的类也可能注册一个关闭钩子,所以你可以在jvm关闭时至少关闭你的资源,但我认为这对于一个库而言是一种不好的做法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.