在try ... finally块中处理代码重复获取资源

时间:2013-07-01 20:50:19

标签: java

我正在使用Java中的数据库,并且已经按照

的方式编写了多个函数
try {
    //acquire resources
}
finally {
    //release resources
}

我知道Java的try-with-resources是一种处理类似事情的好方法,但我使用的是Java 6.是否有一种减少代码重复的标准方法?我希望有一种干净的方式来编写多个函数,这些函数具有相同的try / finally块用于资源分配,但是它们的主体不同。

我目前的想法是使构造函数获取资源的类的函数成员的主体成为可能。但是,没有RAII,它似乎仍然有点混乱。

4 个答案:

答案 0 :(得分:3)

如果你有能力使用Guava(14.0+),你可以使用Closer。虽然它不会消除所有重复,但它是一种非常方便的方式来处理实施Closeable的资源 - 并且不止一个,在此处:

final Closer closer = Closer.create();
final InputStream in1;
final InputStream in2; // whatever, as long as Closeable is implemented

try {
    in1 = closer.register(createIn1());
    in2 = closer.register(createIn2());
    // do stuff
} finally {
    closer.close();
}

此课程将优雅地处理所有资源的关闭,并按照您注册它们的相反顺序处理。

如果你买不起番石榴,那么自己编写一个简单的版本很容易。

答案 1 :(得分:1)

看看Project Lombock;它使用注释处理来整理样板。

更具体地说,您可以使用@Cleanup注释,它将在编译时包装在try...finally中。

所以你的代码来自

final Connection con...
try {
    //do stuff
} finally {
    con.close();
}

@Cleanup
final Connection con...

两者都将编译为相同的代码

答案 2 :(得分:1)

您可以使用方面。工作中方面的一个很好的例子是 Spring 框架。以这种方式实现的功能之一是事务支持。事务方面是处理事务开放,提交(正常进行)或回滚(异常),并在每种情况下释放。

答案 3 :(得分:0)

似乎Execute Around成语正好描述了这个用例 - What is the "Execute Around" idiom?

然而,实施

似乎有些混乱