0

我有一个问题,我现在想不通。我有一个作为 Iframe 的类,它具有变量“private List pathContainer”来维护 Iframe 的路径。

给出的是它的代码,

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 以将其包含在其列表中。但是,当我修改 subIframe 路径列表时,父 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 列表也将使用新值进行更改。我没有更新通过的列表。请告诉我哪里出错了?

4

4 回答 4

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);
于 2013-03-29T02:03:51.840 回答
1

在 Java 中,当传递的对象发生更改时,即使方法返回,更改也是持久的。当您将 iframe 的 pathcontainer 设置为 parentPath,然后将路径取出时,您将获得对同一 parentPath 的引用。当你改变它时,它仍然存在。如果你不想要这个,复制一份。

你可以通过调用来做到这一点

List<String> tempPath = new ArrayList<String>(parentPath);
iframe.setPathContainer(tempPath);
于 2013-03-29T02:04:37.557 回答
1

问题是你有几个指向同一个对象的引用变量。我建议您进行一些研究以了解参考变量的工作原理。

要解决此问题,您需要在将 List 传递给方法之前或之后立即对其进行复制。

于 2013-03-29T02:07:59.087 回答
0

您需要制作列表的副本或以不同的方式传递信息,因为每个参考都指向原始内容,因此您所做的任何更改都会影响原始内容。

StackOverflow 有几个克隆数组列表的例子:

clone(): ArrayList.clone() 我以为做了一个浅拷贝

ArrayList 浅拷贝迭代或 clone()

如何克隆 ArrayList 并克隆其内容?

于 2013-03-29T02:04:55.233 回答