0

私は非常に単純なコードを書こうとしていますが、それを行うためのエレガントなソリューションを見つけることができません:

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

これは明らかにコンパイルされません。私が知っている2つの解決策は両方とも悪臭を放っています。クラスフィールドをカウントしたくないのは、それが実際にはロギング目的で必要なローカル変数だからです。単純に醜いので、配列を数えたくありません。

これはばかげているだけです。それを行うための合理的な方法が必要ですか?

4

3 に答える 3

5

3 番目の可能性は、次のように 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 に答える