Java中的无痛资源管理
时间:2020-03-05 18:52:05 来源:igfitidea点击:
在C ++中,我们在构造函数中获取资源,然后在析构函数中释放它。
因此,当函数中间出现异常时,将不会发生资源泄漏或者锁定的互斥锁或者其他任何情况。
AFAIK Java类没有析构函数。因此,如何使用Java进行资源管理。
例如:
public int foo() { Resource f = new Resource(); DoSomething(f); f.Release(); }
如果DoSomething引发异常,如何释放资源?我们不能在整个代码中放置try \ catch块,可以吗?
解决方案
回答
是的,我们可以并且应该在代码中放置try / catch / finally块。在Cthere中有一个简写的" using"语句,但是在Java中,我们会遇到以下问题:
public int foo() { Resource f = new Resource(); try { DoSomething(f); } finally { f.Release(); } }
回答
如果我们希望using块参与Java闭包辩论:S
回答
很抱歉让我们失望,但是在Java中,我们确实使用了try \ catch \ finally块。 "很多"是指很多。有时我确实希望Java具有Cusing块。大多数时候,我们不需要释放资源,因为Java的垃圾收集器会解决这一问题。
但是,异常确实可以使错误处理更加干净。我们可以编写自己的异常,并在执行任何操作时捕获它们。不再向用户返回任意错误代码!
回答
可以使用"周围执行"成语排除try / finally(以及异常和算法)。但是,语法非常冗长。
public int foo() { withResource(new WithResource() { public void run(Resource resource) { doSomething(resource); }}); } ... public interface WithResource { void run(Resource resource); } public static void withResource(WithResource handler) { Resource resource = new Resource(); try { handler.run(resource); } finally { resource.release(); } }
如果我们要进行的抽象工作比try / finally多,则这种事情更有意义。例如,使用JDBC,我们可以执行一条语句,遍历结果,关闭资源并包装异常。