2012-06-07 79 views
0

我試圖寫一個非常簡單的代碼,並不能找出一個優雅的解決方案做最後的限制越來越:模式爲圍繞Java封

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

這顯然無法編譯。我知道的兩個解決方案都很臭: 我不想計算一個類字段,因爲它實際上是一個本地變量,我只需要用於日誌記錄目的。 我不想計算一個數組,因爲它很醜陋。

這是愚蠢的,有一個合理的方式來做到這一點?

回答

5

第三種可能性是使用最終可變-INT-對象,例如:

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

阿帕奇百科全書也有MutableInteger我相信,但我沒有用它。

+0

謝謝,這確實體面。 –

+0

聰明。但不知道我喜歡這個,因爲AtomicInteger意味着需要線程安全,這在這裏可能會有誤導。儘管代碼更繁瑣,我更喜歡int [1]黑客。但它很聰明,所以我並不是低調(也不是高調)。 – user949300

+0

@ user949300我同意這就是爲什麼我提出了一個沒有這種內涵的替代方案。 – assylias

0

我通常做算一類領域,但添加註釋,這只是一個領域,因爲它由內關閉,可運行等..

2

你似乎已經知道了解決方案(它們雖然不同);並且您可能知道原因(它不能通過引用捕獲局部變量,因爲該變量在運行閉包時可能不存在,所以它必須按值捕獲(具有多個副本);具有相同變量請參閱不同範圍內的不同副本,每個副本可以獨立更改,因此不能更改)。

如果你的閉包不需要將狀態返回到封閉範圍,那麼類中的一個字段是正確的。我不明白你的反對意見是什麼。如果閉包需要能夠被多次調用並且每次需要增加,那麼它需要在對象中保持狀態。一個字段(實例變量)正確表達了對象中狀態的存儲。該字段可以使用外部範圍的捕獲值進行初始化。

如果你的閉包需要將狀態返回到封閉範圍(這不是一個很常見的情況),那麼使用可變結構(如數組)是正確的選擇,因爲它避免了本地變量的生命週期。