2013-03-29 29 views
0

我有一個問題,我現在無法弄清楚。我有一個類作爲Iframe,它具有變量「private List pathContainer」來維護Iframe的路徑。通過ArrayList正在更新+ Java

考慮的是它的代碼,

public class IFrame implements HtmlElement { 

private WebElement elem; 
private String xpath; 
private boolean selected; 
private String parentClass; 
private boolean isProcessed=false; 
private boolean isIframeContent=false; 
private List <String> pathContainer; 

    public IFrame(WebElement elem) { 
    this.elem = elem; 
    pathContainer=new ArrayList<String>(); 
} 

我傳遞一個父iframe的路徑列表,子IFRAME將其包含在它的清單。但是,當我修改子圖框路徑列表時,父級Iframe路徑列表也被更改。由於是函數的代碼,

public void LoadIFrameNodes(List<String> parentPath){ 
     IFrame iframe=new IFrame(e); 
     List <String> tempPath=new ArrayList<String>(); 
     iframe.setPathContainer(parentPath); //assigning parent path in subIframe list 
     tempPath=iframe.getPathContainer(); 
     tempPath.add(iframe.getXpath()); // add another value to subIframe 
     iframe.setPathContainer(tempPath); //setting the changed list as the subIframe 
    } 

一旦該subIframe設置新的價值觀,傳遞parentPath名單也被用新值改變。我沒有通過要更新的列表。請讓我知道哪裏出了問題?

+2

只需複製清單後傳入或通過它之前。 –

+0

您可以執行'列表 tempParentPath =新的ArrayList (parentPath);' –

回答

3
iframe.setPathContainer(parentPath); //assigning parent path in subIframe list 
tempPath=iframe.getPathContainer(); 

除非這些的getter/setter方法讓防守副本(通常他們不這樣做),你tempPath只是指向同一個對象parentPath

您需要在更新列表之前製作一份副本。

final List<String> tempPath=new ArrayList<String>(parentPath); 
tempPath.add(iframe.getXpath()); 
iframe.setPathContainer(tempPath); 
+0

謝謝@thilo。這解決了這個問題。 – CCoder

1

在Java中,當傳遞的對象發生更改時,即使方法返回,更改也是持久的。當您將iframe的pathcontainer設置爲parentPath並將路徑取出時,您將獲得對同一個parentPath的引用。當你改變它時,它仍然存在。如果你不想要這個,請複製一份。

可以與呼叫爲此

List<String> tempPath = new ArrayList<String>(parentPath); 
iframe.setPathContainer(tempPath); 
+0

謝謝@Jimmy Lee – CCoder

1

的問題是,你有幾個參考變量,點於同一對象。我建議你做一些研究以瞭解引用變量是如何工作的。

要解決此問題,需要立即之前或將其傳遞給方法後,使表的副本。

+0

Thanks @ Code-Guru – CCoder