2017-06-10 20 views
1

我正在Eclipse IDE上編寫Java SE 8應用程序。我遇到的問題在後面。遞增原始包裝類作爲參數傳遞給對調用者沒有影響的方法

private Object[][] adjustIndexTaskValueAdded(int size){ 
     Integer adjustingIndex = 0; 
     Object[][] tasksDisplay = new Object[size][taskValues[0].length]; 

     for (int i = 0; i < size; i++) {       
      tasksDisplay[i][0] = taskValues[i][0];//phase colour 
      tasksDisplay[i][1] = identifyNextRowIDTaskTable(adjustingIndex, i);// the index 
     } 
     return tasksDisplay; 
} 

所以,我有adjustingIndex整數包裝類,我傳遞給identifyNextRowIDTaskTable()方法。以便本地var可以存儲在子方法中修改的值。

private String identifyNextRowIDTaskTable(Integer adjustingIndex, int currentRowID){ 
     if(UtilityOperations.isPhaseRow(phaseColourCurrent)){//it's a phase row 
      adjustingIndex++; 
      return ""; 
     } 
     else{//it's a task row 
      int displayID = tableID - adjustingIndex; 
      adjustingIndex = 0; 
      return String.valueOf(displayID);   
     } 
} 

上述方法顯示其修改整數包裝類我傳遞給該方法。 現在,當我運行應用程序時,新值不會反映在調用方法上。看起來值在子方法上發生了變化/調整,但父方法沒有看到變化。最終,結果變得錯誤。

顯示的源代碼被簡化了...

那麼,什麼問題是? 我傳遞引用類型var,它不是一個遞歸操作。 當然,我可以使用對象的狀態來存儲值。然而,我想了解目前的陷阱。

問候

回答

3

考慮

adjustingIndex++; 

這是拆箱從Integer價值得到int並增加該值,這相當於:

int tmp = adjustingIndex.intValue(); 
tmp++; 
adjustingIndex = Integer.valueOf(tmp); 

這將重置參數adjustingIndex成爲新的參考整數,它不會更改調用方法中adjustingIndex變量的值 - 這是一個單獨的參考。

再次考慮:

adjustingIndex = 0; 

同樣,這將重置參數adjustingIndex是到一個新的整數的引用,它不會在調用方法改變adjustingIndex變量的值。

一個替代方案將是使用AtomicInteger

AtomicInteger adjustingIndex = new AtomicInteger(0); 

增量與

adjustingIndex.incrementAndGet(); 

設置回零與

adjustingIndex.set(0); 

AtomicInteger有方法來改變整數的值它包含,相反Integer是不可變的其價值無法改變。

相關問題