2010-11-16 31 views
2

我在我的动作类下面的代码:List.addAll被复制会话变量

MemberData mbr = MyUtil.getMember(request.getSession()); 
::::::::::::::::::::::: 
{ 
List sysList = mbr .getSystemList(); //returns 'systemList' 
sysList.addAll(mbr .getUserEnteredList()); //add user entered to the system entered objects list 
addWorksheetFor(wb, sysList); //add the list to an excel workbook 
} 

我有MemberData会话,它含有一种叫,说,SystemList中列表。当我使用List sysList = mbr.getSystemList()并添加用户输入列表时,会话对象中的'systemList'被修改。我将这两个列表添加到局部变量'sysList'中,但会话变量'systemList'也被修改。它变得和'sysList'一样。

然而,当我通过SystemList中和userEnteredList迭代分开,并添加到第三列表如下所示:

MemberData mbr = MyUtil.getMember(request.getSession()); 
::::::::::::::::::::::: 
{ 
List sysList = mbr .getSystemList(); //returns 'systemList' 
List userList = mbr .getUserEnteredList(); //returns 'userEnteredList' 
List allList = new ArrayList(); 
for (Iterator it=sysList.iterator(); it.hasNext();) 
allList.add(it.next()); 
for (Iterator it=userList.iterator(); it.hasNext(); 
allList.add(it.next()); 
addWorksheetFor(wb, sysList); //add the list to an excel workbook 
} 

然后,它的工作原理。在这种情况下,会话变量不会被修改。 任何想法?

+0

这是Java,对不对? – Gabe 2010-11-16 12:57:29

+0

你对你的一些问题有很多答案。你确定没有人能够被接受为正确答案吗? – willcodejavaforfood 2010-11-16 13:03:34

回答

1

当您获得引用时,Java并未返回值(实例)的副本,如您所期望的那样。它完全返回相同的值(实例)。这就是所谓的传值(Pass-by-Value),对于具有过程式编程语言背景(例如PHP)的程序员来说确实令人困惑。

最好的办法是只创建一个新的(实例)。然而,您尝试的方式有点笨拙,可以简化如下:

List sysList = mbr.getSystemList(); // returns 'systemList' 
List userList = mbr.getUserEnteredList(); // returns 'userEnteredList' 
List allList = new ArrayList(sysList); // creates a copy of 'sysList' 
allList.addAll(userList); // adds 'userList' to copy of 'sysList' 
+0

感谢您的非常好的答案和很好的解决方案。 :) – rishi 2010-11-17 15:11:34

2
List sysList = mbr .getSystemList(); 

如果您直接在MemberData都sysList返回列表实例变量和MemberData.sysList将是相同的列表。所以对其中一个的任何改变都会反映在另一个中。

为了解决这个问题,你需要在你的代码的地方创建一个新的列表,最好的地方是大概在MemberData吸气。