尝试使用资源自动关闭问题

时间:2016-11-01 09:32:08

标签: java

我正在使用遗留代码,在那里我看到在try-with-Resources关闭块中启动了某些数据库事务。我知道一旦执行try块中的代码,DB资源将被关闭。在这种情况下,有人可以帮助我,我怎么能超越或绕过自动关闭?我正在使用遗留代码,这也是非常短的时间,所以不要改变太多的代码,并邀请单元测试失败。

1 个答案:

答案 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;
    }     
}