我想在xhtml页面上计算所有元素。我期望每个下一个元素都会以更大的顺序放入HashMap。
private void addComponents(HashMap的相关信息, List components,Integer order,FacesContext context){
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
同样,以下方法效果很好
private int addComponents(HashMap的相关信息, 列出组件,整数顺序,FacesContext上下文 ){ if((components == null)|| components.isEmpty()) 退货订单;
for (UIComponent c : components) { order = order + 1000; infos.put(c.getClientId(context), order); order = addComponents(infos, c.getChildren(), order, context); } return order;
}
为什么这两种方法的工作方式不同?
答案 0 :(得分:2)
您必须记住Java中的参数赋值不会影响该调用方法。因此,当您执行order = order + 1000
时,这不会影响order
调用实例中addComponents
的值。通过返回值,您允许调用者将其值更新为递归调用的值。
解决此问题的一个选择是使用字段,但如果您是多线程的话,可能会遇到线程安全问题。
答案 1 :(得分:0)
第二种方法工作正常,因为递归传递的顺序值已经递增,因此它也反映在递归中。
在第一种方法中,按原样传递顺序值(不先递增),它将值传递给下一个递归;并且以相同的方式继续直到您到达递归的底部,订单值保持为1000并且在地图infos
中填充相同的内容。
只有当堆栈展开时,订单值才会递增,但放在infos
映射中的值仍然保持不变1000,尽管println()
语句可能会让您不这么认为。