0

我想计算我的 xhtml 页面上的所有元素。我希望每个下一个元素都以更大的顺序放入 HashMap 中。

private void addComponents(HashMap infos, 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 infos, List components, Integer order, FacesContext context) { if ((components == 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;

}

为什么这两种方法的工作方式不同?

4

2 回答 2

2

您必须记住,Java 中的参数分配不会影响调用方法。因此,当您这样做时order = order + 1000,不会影响 的order调用实例中的值addComponents。通过返回值,您允许调用者将其值更新为递归调用的值。

解决此问题的一种选择是使用字段,但如果您是多线程的,则可能会遇到线程安全问题。

于 2013-05-29T13:15:56.463 回答
0

第二种方法工作正常,因为递归传递的订单值已经增加,因此它也反映在递归中。

在您的第一种方法中,您按原样传递订单值(不先递增),这会将值按原样传递给下一个递归;并以同样的方式继续,直到你到达递归的底部,订单值保持在 1000 并且在你的地图中填充相同的值infos

只有当堆栈展开时,订单值才会增加,但您放置在infosmap 中的值仍然保持不变 1000,尽管这些println()语句可能会让您不这么认为。

于 2013-05-29T13:21:38.223 回答