我有一个我现在无法弄清楚的问题。我有一个类作为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,以将其包含在列表中。但是,当我修改子帧路径列表时,父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列表也会随新值一起更改。我没有更新传递的列表。请告诉我哪里出错了?
答案 0 :(得分:3)
iframe.setPathContainer(parentPath); //assigning parent path in subIframe list
tempPath=iframe.getPathContainer();
除非那些获取者/制定者制作防御性副本(通常他们没有),否则tempPath
只会指向与parentPath
相同的对象。
在更新之前,您需要复制一份清单。
final List<String> tempPath=new ArrayList<String>(parentPath);
tempPath.add(iframe.getXpath());
iframe.setPathContainer(tempPath);
答案 1 :(得分:1)
在Java中,当传递的对象发生更改时,即使方法返回,更改也会持久。当您将iframe的pathcontainer设置为parentPath,然后将路径退出时,您将获得对同一parentPath的引用。当你改变它时,它会持续存在。如果你不想要这个,请复制一份。
您可以通过电话
执行此操作List<String> tempPath = new ArrayList<String>(parentPath);
iframe.setPathContainer(tempPath);
答案 2 :(得分:1)
问题是你有几个指向同一个对象的引用变量。我建议你做一些研究,以了解参考变量的工作原理。
要解决此问题,您需要在将List传递给方法之前或之后立即复制List。
答案 3 :(得分:0)
您需要制作列表的副本或以不同方式传递信息,因为每个引用都指向原始信息,因此您所做的任何更改都会影响原始信息。
StackOverflow有几个克隆arraylists的例子:
clone(): ArrayList.clone() I thought does a shallow copy