我正在使用遗留代码,在那里我看到在try-with-Resources关闭块中启动了某些数据库事务。我知道一旦执行try块中的代码,DB资源将被关闭。在这种情况下,有人可以帮助我,我怎么能超越或绕过自动关闭?我正在使用遗留代码,这也是非常短的时间,所以不要改变太多的代码,并邀请单元测试失败。
答案 0 :(得分:1)
不幸的是,你不能通过将try-with-resources标识符分配给null
或者类似的技术来解决这个问题:Java不允许你这样做。
这是一件好事,因为它会污染您的源代码,使临时变更的逆转变得困难。
幸运的是有更好的方法:如果你能够稍微改变资源类,你总是可以在它上面构建一个disableClose()
方法,它设置一些标志,以便随后的close()
调用是良性。如果您无法更改资源类,则从中派生一个类并创建该实例。尽管这可能需要样板构造函数代码,但它可能是一种更好的方法,因为那时你可以构建一些跟踪未正确关闭的实例的东西。
采用这两种技术意味着你可以通过删除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;
}
}