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();

それらのゲッター/セッターが防御的なコピーを作成しない限り (通常は作成しません)、あなた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 シャロー コピー iterate または clone()

ArrayList を複製し、その内容も複製する方法は?

于 2013-03-29T02:04:55.233 に答える