2010-11-16 69 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吸氣。