2013-05-29 36 views
0

我想記下我的xhtml頁面上的所有元素。我期望每個下一個元素都以更大的順序放入HashMap。如何處理遞歸方法參數的變量?

私人無效addComponents(HashMap的相關信息, 列表組件,整秩序,FacesContext的上下文){

System.out.println("Start: "+order); 

    if ((components == null) || components.isEmpty()) 
    { 
     System.out.println("return: "+order); 
     return; 
    } 
    order = order + 1000; 
    for (UIComponent c : components) { 
     System.out.println("HashMap: "+order); 
     infos.put(c.getClientId(context), order); 
     addComponents(infos, c.getChildren(), order, context); 
     System.out.println("Out: "+order); 
     order = order + 1000; 
    } 
    System.out.println("End: "+order); 
    return; 

}

我爲輸出和錯誤記數

HashMap: 1000 

Start: 1000 

return: 1000 

Out: 1000 

HashMap: 2000 

Start: 2000 

return: 2000 

Out: 2000 

HashMap: 3000 

Start: 3000 

HashMap: 4000 

Start: 4000 

return: 4000 

Out: 4000 

HashMap: 5000 

Start: 5000 

return: 5000 
Out: 5000 
HashMap: 6000 

Start: 6000 

return: 6000 

Out: 6000 

End: 7000 

Out: 3000 

HashMap: 4000 

在同一以下方法效果不錯

私人詮釋addComponents(HashMap的相關信息, 列表組件,整數階,FacesContext的上下文 ){ IF((組件== NULL)|| components.isEmpty()) return order;

for (UIComponent c : components) { 

      order = order + 1000; 
      infos.put(c.getClientId(context), order); 

     order = addComponents(infos, c.getChildren(), order, context); 

    } 
    return order; 

}

爲什麼這兩種方法的工作方式不同?

回答

2

您必須記住,Java中的參數分配不會影響該調用方法。因此,當您執行order = order + 1000時,這不會影響調用實例addComponentsorder的值。通過返回值,您允許調用方將其值更新爲遞歸調用的值。

解決此問題的一個選擇是使用字段,但如果您是多線程的,則可能會遇到線程安全問題。

+0

訂單值正在作爲addComponents(infos,c.getChildren(),** order **,context)在每個遞歸上傳遞。那麼,它是不是也會反映在被調用的方法中呢? –

+0

該方法的CALLED實例獲取傳入的值。但是,如果CALLED實例更新參數值,則CALLING實例不會看到此更新。 –

0

第二種方法可以正常工作,因爲遞歸傳遞的順序值已經遞增,因此它也反映在遞歸中。

在您的第一個方法中,按原樣傳遞訂單值(不先遞增),該值按原樣傳遞給下一個遞歸;並以相同的方式繼續,直到您達到遞歸的底部,訂單值保持在1000,並且您的地圖infos中填充的值相同。

只有當堆解開,該訂單價值得到增加,但你放在infos地圖的價值仍然是相同的1000雖然println()語句可能讓你認爲並非如此。