0

我正在尝试编写一段非常简单的代码,但无法找到一个优雅的解决方案:

int count = 0;
jdbcTemplate.query(readQuery, new RowCallbackHandler() {
         @Override
         public void processRow(ResultSet rs) throws SQLException {
            realProcessRow(rs);
            count++;
         }
      });

这显然不能编译。我知道的两种解决方案都很臭:我不想计算一个类字段,因为它实际上是一个局部变量,我只需要用于记录目的。我不想计数一个数组,因为它很丑陋。

这只是愚蠢的,必须有一个合理的方法来做到这一点?

4

3 回答 3

5

第三种可能性是使用 final-mutable-int-object,例如:

final AtomicInteger count = new AtomicInteger(0);
....
count.incrementAndGet();

Apache Commons 也有一个MutableInteger我相信的,但我没用过。

于 2012-06-07T18:48:29.237 回答
2

您似乎已经知道解决方案(尽管它们不同);你可能知道原因(它不能通过引用捕获局部变量,因为在闭包运行时变量可能不存在,所以它必须按值捕获(有多个副本);拥有相同的变量是不好的指不同范围内的不同副本,每个副本都可以独立更改,因此无法更改)。

如果您的闭包不需要将状态共享回封闭范围,那么类中的字段是正确的做法。我不明白你的反对意见是什么。如果闭包需要能够被多次调用并且每次都需要递增,那么它需要在对象中维护状态。字段(实例变量)正确地表达了对象中状态的存储。该字段可以使用从外部范围捕获的值进行初始化。

如果您的闭包需要将状态共享回封闭范围(这不是很常见的情况),那么使用可变结构(如数组)是正确的做法,因为它避免了本地生命周期的问题多变的。

于 2012-06-07T21:03:08.163 回答
0

我通常计算一个类字段,但添加一个注释,它只是一个字段,因为它被内部闭包、Runnable 等使用...

于 2012-06-07T18:49:57.010 回答