2013-05-29 37 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()语句可能让你认为并非如此。