Java 尝试解决资源自动关闭问题
我使用的是一个遗留代码,其中我看到在try with Resources close块中启动了某些DB事务。我知道一旦try块中的代码被执行,DB资源将被关闭。有人能帮我吗?在这种情况下,我怎样才能越过或绕过自动关闭?我在很短的时间内处理遗留代码,因此不希望更改太多代码,并导致单元测试失败。不幸的是,您无法通过将try-with-resources标识符指定为Java 尝试解决资源自动关闭问题,java,Java,我使用的是一个遗留代码,其中我看到在try with Resources close块中启动了某些DB事务。我知道一旦try块中的代码被执行,DB资源将被关闭。有人能帮我吗?在这种情况下,我怎样才能越过或绕过自动关闭?我在很短的时间内处理遗留代码,因此不希望更改太多代码,并导致单元测试失败。不幸的是,您无法通过将try-with-resources标识符指定为null或类似的技术来解决这一问题:Java不允许您这样做 这是一件好事,因为它会污染您的源代码,使临时更改的反转变得困难 幸运的是,有更
null
或类似的技术来解决这一问题:Java不允许您这样做
这是一件好事,因为它会污染您的源代码,使临时更改的反转变得困难
幸运的是,有更好的方法:如果您能够稍微更改resources类,您可以始终在其上构建一个disableClose()
方法,该方法设置一些标志,以便后续的close()
调用是良性的。如果您不能更改resources类,那么可以从中派生一个类,并创建该类的实例。尽管这可能需要样板构造函数代码,但这可能是一种更好的方法,因为这样您就可以构建一些跟踪未正确关闭的实例的方法
采用这两种技术都意味着您只需删除disableClose()
方法或派生类,即可删除此临时更改,这将导致编译失败,您可以逐一修复
派生类方法的可能实现:
public class Foo extends YourResource
{
// ToDo - add constructors here.
private boolean disable = false;
@Override
public void close()
{
// ToDo - consider maintaining a collection of unclosed instances.
if (!disable){
super.close();
}
}
public void disableClose()
{
disable = true;
}
}
那么,您想通过不关闭必须关闭的资源在代码中引入bug吗?为什么?没有任何代码和更具体的输入,你打算做什么/改变什么。。。我们无能为力。