所以 Java 7 有一个漂亮的特性可以自动关闭一个AutoCloseable
类。如果我有Bar
实现Closeable
(这反过来扩展AutoCloseable
),并且有办法Bar
从 a打开Foo
,我可以这样做:
try(Bar bar=foo.openBar())
//do something
}
...并且bar
会自动关闭,就像放在一个finally
子句中一样。迷人的。
但是,如果我想获得一个Bar
并稍后打开它怎么办?因为也许 aBar
就像 aFile
并且只是标识一个资源;我可能想识别其中很多,但只在必要时打开它们。
Bar bar=foo.getBar();
try(bar.open()) //doesn't work
//do something
}
但是 Java 7 自动管理的方法要求我在try
子句中分配一个变量,不是吗?
所以也许我可以很聪明并且有Bar.open()
回报this
(即Bar
实例),这样我就可以做到这一点:
try(Bar bar=foo.getBar().open())
//do something
}
这个功能如我所愿,但它给了我一个警告,中间Bar
实例永远不会关闭。
所以也许我可以这样做:
Bar bar=foo.getBar();
try(Bar temp=bar.open())
//do something
}
这也是我想要的功能,但除了丑陋之外,我仍然收到警告——这次第一个bar
变量永远不会关闭。
所以也许我可以将bar.open()
调用放在受保护的块内,如下所示:
try(Bar bar=foo.getBar())
bar.open();
//do something
}
这将按我想要的方式工作——大多数时候。但是如果bar.open()
抛出异常怎么办?Java 7 将尝试关闭bar
,在我的实现中,它会抛出一个,IllegalStateException
因为您无法关闭从未打开过的东西。所以它应该,对吧?因为如果有人试图在Bar
实例打开之前关闭它,就会出现问题,我们需要一种快速失败的方法,而不是让问题在未知时间传播并浮出水面。
但也许我真的很想使用自动资源管理,所以我考虑放松一下Bar.close()
,这样你可以随时关闭它,即使你没有打开Bar
. 但现在看看我在做什么:我正在改变我的 API(可以说让它变得低劣)只是为了使用一些语法编译器糖!
还有其他想法吗?我想使用 Java 7 自动资源管理,以便 Java 7 自动关闭我的资源,但我想决定何时打开它,这可能不一定是在我获取资源的那一刻。