我有一个实现了AutoCloseable的类,并且打算与Java7的新资源尝试构造一起使用。但是,我找不到一种方法来保证我的类的用户使用资源尝试。如果这种情况没有发生,那么我的类将无法关闭自己,并且会发生不好的事情。有什么方法——语言构造或其他方法——来强制执行它吗?甚至能够检测我是否处于资源尝试块中,这样如果没有,我就可以抛出异常(尽管编译时构造更可取)。
谢谢
不,不可能,如果你一直打开文件或数据库连接而不关闭它们,同样的坏事也会发生。。。
如果可以在一个方法调用的范围内使用和分配合理的资源,则可以在每次调用api时打开/关闭,如果没有,则只需将行为记录在案即可。
您的类可能还注册了一个关闭钩子,这样您至少可以在jvm停止时关闭资源,但我认为这对于库来说是一个糟糕的做法。
如果您真的关心资源管理,那么使用回调习惯用法是最安全的方法。您不公开集合,而是公开一个允许最终用户处理集合中项目的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);
}
}
}
}
您可以更改回调。如果要支持提前退出,则处理(T)以返回布尔值:
try (...) {
for (Precious i : ...) {
if (callback.handle(i)) break;
}
}
如果您不想定义自己的回调接口,可以使用Guava的函数
函数的实例通常被期望是引用透明的——没有副作用——并且与equals一致,也就是说,a.equals(b)意味着该函数。应用(a)。等于(函数。应用(b))。
谓词实例通常期望没有副作用,并且与equals一致。
不幸的是,没有办法保护自己免受用户愚蠢的侵害。
您可以实现finaliz
方法来调用关闭
;这样您可以确保至少在对象被垃圾回收时关闭资源,即使您不知道何时(或是否)发生。
如果您可以限制项目的使用方式,您可能可以使用面向方面的编程来强制执行某些策略,但这样您就不再真正使用Java了。
我目前正在进行一个项目,该项目使用HP的Fortify SCA工具来捕捉代码库中的安全问题。我在确定正确处理JDBC资源的最佳方法时遇到了一些问题。 我现在拥有的代码如下所示; 问题是Fortify会标记这段代码,说明如果嵌套的try语句中发生异常,那么对conn和ps的引用将丢失,它们将无法正确关闭。fortify标记这一点是正确的还是误报?据我所知,try with资源应该总是关闭它们的资源,
本文向大家介绍浅谈java7增强的try语句关闭资源,包括了浅谈java7增强的try语句关闭资源的使用技巧和注意事项,需要的朋友参考一下 java7增强的try语句关闭资源 传统的关闭资源方式 使用finally块来关闭物理资源,保证关闭操作总是会被执行。 关闭每个资源之前首先保证引用该资源的引用变量不为null。 为每一个物理资源使用单独的try...catch块来关闭资源,保证关闭资源时引发
我看到这篇文章给出了使用WebClient将文件上传到ftp的简单想法。这很简单,但如何强制它使用SSL?
问题内容: 我们正在与第三方进行集成,该第三方发送的XML的Content-Type标头为text / html。我们正计划使用Spring的RestTemplate将其映射到我们从xsds生成的类,但是RestTemplate无法找到合适的转换器用于内容。第三方拒绝修复内容类型,因为它可能破坏其他伙伴的集成。 Spring的RestTemplate是否有办法强制其使用特定的转换器?我们基本上只是
问题内容: 我正在运行没有代理并且使用SSL的node.js express 3服务器。 我试图弄清楚如何强制所有连接通过https。 Google搜索向我显示了这一点: https://groups.google.com/forum/#!topic/express- js/Bm6yozgoDSY 当前没有办法强制执行https重定向,尽管这似乎有点奇怪。我们有一个仅使用https的应用程序,并且
我们正在与第三方集成,该第三方以text/html的形式发送带有content-type标题的xml。我们计划使用Spring的RestTemplate将其映射到我们从xsds生成的类,但是RestTemplate未能为内容找到合适的转换器。第三方拒绝修复内容类型,因为这可能会破坏其他合作伙伴的集成。 Spring的RestTemplate有办法强制它使用特定的转换器吗?我们基本上只是在做以下几点