Java 尝试解决资源自动关闭问题

Java 尝试解决资源自动关闭问题,java,Java,我使用的是一个遗留代码,其中我看到在try with Resources close块中启动了某些DB事务。我知道一旦try块中的代码被执行,DB资源将被关闭。有人能帮我吗?在这种情况下,我怎样才能越过或绕过自动关闭?我在很短的时间内处理遗留代码,因此不希望更改太多代码,并导致单元测试失败。不幸的是,您无法通过将try-with-resources标识符指定为null或类似的技术来解决这一问题:Java不允许您这样做 这是一件好事,因为它会污染您的源代码,使临时更改的反转变得困难 幸运的是,有更

我使用的是一个遗留代码,其中我看到在try with Resources close块中启动了某些DB事务。我知道一旦try块中的代码被执行,DB资源将被关闭。有人能帮我吗?在这种情况下,我怎样才能越过或绕过自动关闭?我在很短的时间内处理遗留代码,因此不希望更改太多代码,并导致单元测试失败。

不幸的是,您无法通过将try-with-resources标识符指定为
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吗?为什么?没有任何代码和更具体的输入,你打算做什么/改变什么。。。我们无能为力。