2

我正在使用 Java 中的数据库,并且一直在编写多个函数

try {
    //acquire resources
}
finally {
    //release resources
}

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

我目前的想法是使构造函数获取资源的类的函数成员的主体。但是,没有 RAII,看起来还是有点乱。

4

4 回答 4

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();
}

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

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

于 2013-07-01T20:53:45.427 回答
1

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

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

所以你的代码来自

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

@Cleanup
final Connection con...

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

于 2013-07-01T21:05:27.540 回答
1

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

于 2013-07-01T21:07:35.687 回答
0

似乎 Execute Around 成语准确地描述了这个用例 -什么是“Execute Around”成语​​?

但是,实施起来似乎有点混乱

于 2013-07-01T20:54:00.377 回答