2015-08-26 44 views
0

新手問題在這裏 - 我有一個方法,通過Spring CrudRepository findOne()方法接受一組用戶ID並設置一個公共屬性。這是我目前的執行聲明對象內部或外部for循環 - 春季

@RequestMapping(value = "/setUsersActive/{ids}", method = RequestMethod.GET) 
public String setActive(@PathVariable Long[] ids) { 
for(Long id : ids) { 
    User user = userRepo.findOne(id); 
    user.setActive("Y");  
    userRepo.save(user);  
} 

這種方法在陣列內可能接受成千上萬的ID - 難道做任何性能上的區別,如果我是申報User對象外for循環像這樣?

User user; 
for(Long id : ids) { 
    user = userRepo.findOne(id); 
    user.setActive("Y");   
} 

任何輸入讚賞感謝

+2

不,它不會。始終儘可能縮小變量的範圍。不是爲了性能,而是爲了正確性,並且容易重構。 –

回答

-1

是的,它會,我將宣佈它的循環,則比較有效。否則,垃圾收集器必須刪除整個對象,並且如果在循環之前聲明它,則可節省少量RAM使用量。由於僅設置對新對象的引用。

+0

兩個版本都在內存中創建了多個對象,並且垃圾收集器在兩個版本中都有相同數量的對象要收集。 –

+0

垃圾收集器只有當它有對象從堆中移除時纔會被調用,只有在沒有更多引用此對象的情況下,對象的空間纔會被gc刷入,在op的代碼中,userRepo仍然保存引用。 – SteveL

1

除非您需要使用該循環之外的上一個保存的User對象,否則沒有理由將其聲明在其外部,它會限制該變量的作用域。就性能而言,讓Java在編譯期間爲您優化它。

1

不,它會轉化爲完全相同的字節碼,不要浪費時間在這樣的事情上,JVM會做出各種奇怪的優化,讓您的代碼儘可能快。

1

這是一個很好的編程實踐,在使用之前不聲明局部變量。

立即聲明局部變量而不立即使用它們可能會不必要地增加它們的範圍。這降低了可讀性,並可能增加不必要的錯誤。

從性能角度來看,沒有什麼區別,因爲在循環之外移動用戶的聲明不會早於該對象生成。

相關問題