gpt4 book ai didi

java - 对于复制粘贴功能,按值传递而不是按引用传递

转载 作者:行者123 更新时间:2023-12-02 05:08:44 25 4
gpt4 key购买 nike

我在 HashSet 中按值传递时遇到问题。每次我想从表内复制数据并将数据粘贴到其他页面上。但我面临的问题是它最终是按引用传递而不是按值传递。这意味着当我单击“粘贴”按钮时,数据是新的 1,而不是假设保存在我的哈希集中的旧 1。请建议我应该如何解决这个问题非常感谢。下面是我的代码:

  static HashSet<ScmTelephoneDetailsViewRowImpl> copy_set = new HashSet<ScmTelephoneDetailsViewRowImpl>(); 

public void copy_data(ActionEvent actionEvent){


for(int z=0;z<scm_details_row.getRowCount();z++){

ScmTelephoneDetailsViewRowImpl telephone_accounting_details_9 =(ScmTelephoneDetailsViewRowImpl)scm_details_row.getRowAtRangeIndex(z);
copy_set.add(telephone_accounting_details_9);

}
System.out.println("copy_set " + copy_set.size());
System.out.println("copy_set " + copy_set.getClass());
}

public void paste_data(ActionEvent actionEvent){

System.out.println("Paste Data");
Iterator setIterator =copy_set.iterator();
while(setIterator.hasNext()){

ScmTelephoneDetailsViewRowImpl get_interator = (ScmTelephoneDetailsViewRowImpl)setIterator.next();

//System.out.println("copy_set "+ setIterator.next());
System.out.println("data inside "+ get_interator.getTelephoneUser());
}

}

最佳答案

在 Java 中,无法按值传递引用类型:只能使用基本类型和引用本身来做到这一点。当你想要复制语义时,你需要自己实现。

您的代码中发生的情况是您正在制作集合的浅拷贝:

for(int z=0;z<scm_details_row.getRowCount();z++){
ScmTelephoneDetailsViewRowImpl telephone_accounting_details_9 =(ScmTelephoneDetailsViewRowImpl)scm_details_row.getRowAtRangeIndex(z);
copy_set.add(telephone_accounting_details_9);
}

上面的循环为您创建了一个新集合,从某种意义上说,如果您从 copy_set 添加或删除任何内容,原始 scm_details_row 将不会看到差异。但是,如果您更改任何 ScmTelephoneDetailsViewRowImpl 对象,原始集合中的对象也会更改,因为这是同一个对象。

要解决此问题,请创建一个复制构造函数或实现某种用于“深层”复制的“克隆”方法,并将深拷贝插入到 copy_set 中:

for(int z=0;z<scm_details_row.getRowCount();z++){
ScmTelephoneDetailsViewRowImpl telephone_accounting_details_9 =
(ScmTelephoneDetailsViewRowImpl)scm_details_row.getRowAtRangeIndex(z);
ScmTelephoneDetailsViewRowImpl copyRow =
new ScmTelephoneDetailsViewRowImpl(telephone_accounting_details_9);
copy_set.add(copyRow);
}

为了使其工作,您需要为您的 ScmTelephoneDetailsViewRowImpl 类定义一个“复制构造函数”:

public ScmTelephoneDetailsViewRowImpl(ScmTelephoneDetailsViewRowImpl other) {
// Initialize this object using the data from the object "other" passed as the parameter
this.someFieldOne = other.someFieldOne;
this.someFieldTwo = other.someFieldTwo;
// If there are collections in the object, make deep copies of them as well
...
}

关于java - 对于复制粘贴功能,按值传递而不是按引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27538123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com