0

xhtml ページのすべての要素を列挙したいと考えています。次のすべての要素がより大きな順序で HashMap に入れられることを期待しています。

private void 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

同時に、次の方法はうまく機能します

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;

}

これら 2 つの方法の動作が異なるのはなぜですか?

4

2 に答える 2

2

Java でのパラメーターの割り当ては、呼び出し元のメソッドには影響しないことに注意してください。SO これを行うと、 の呼び出しインスタンスのorder = order + 1000の値には影響しません。値を返すことにより、呼び出し元はその値を再帰的に呼び出された値に更新できます。orderaddComponents

これを解決する 1 つのオプションは、フィールドを使用することですが、マルチスレッドの場合、スレッド セーフの問題が発生する可能性があります。

于 2013-05-29T13:15:56.463 に答える