Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复制粘贴函数按值传递而不是按引用传递_Java_Jakarta Ee_Hashset_Oracle Adf - Fatal编程技术网

Java 复制粘贴函数按值传递而不是按引用传递

Java 复制粘贴函数按值传递而不是按引用传递,java,jakarta-ee,hashset,oracle-adf,Java,Jakarta Ee,Hashset,Oracle Adf,我对HashSet中的pass-by-value有一个问题。每次我都想从表内复制数据并将数据粘贴到另一页上。但我面临的问题是,它最终会以按引用传递而不是按值传递。这意味着当我点击“粘贴”按钮时,数据是新的1,而不是旧的1,假设它保存在我的哈希集中。请告知我应该如何解决此问题非常感谢。以下是我的代码: static HashSet<ScmTelephoneDetailsViewRowImpl> copy_set = new HashSet<ScmTelephoneDetail

我对HashSet中的pass-by-value有一个问题。每次我都想从表内复制数据并将数据粘贴到另一页上。但我面临的问题是,它最终会以按引用传递而不是按值传递。这意味着当我点击“粘贴”按钮时,数据是新的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());            
        }   

}
static HashSet copy_set=new HashSet();
公共作废复制_数据(ActionEvent ActionEvent){

对于Java中的(intz=0;z),没有办法按值传递引用类型:只能通过基元类型和引用本身来传递。当需要复制语义时,需要自己实现它

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

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);
}
为了使其正常工作,您需要为
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
    ...
}

显然,ScmTelephoneDetailsViewRowImpl是一个对象,而不是一个简单的值。但我认为您需要的是一个新对象,它与原始对象相同(所有字段都相同),但占用不同的内存

你打过类似的领带吗

ScmTelephoneDetailsViewRowImpl temp = telphone_accounting_details_9.clone();
copy_set.add(temp);
这里真正需要的是一个深度副本。它手动复制所有字段

如果您可以直接扩展或修改类ScmTelephoneDetailsViewRow,则可以重写从对象继承的clone()函数

修订版:为了在对象上调用clone(),它需要实现名为Cloneable的“接口”。但该接口中没有方法。因此,您只需要在类定义中添加“implements Cloneable”。假设您控制该类


clone()的默认实现的另一个问题是,如果对象包含任何非基本字段(如数组),那么将创建指向该数组的指针的副本,它将不会创建“deep”复制它生成新数组空间的位置,并复制所有数组元素,或自行选择一个新的复制命令。

在必要时显式复制数据…?将数据从一个表复制到不同页面中的其他表。您是否介意详细解释如何使用克隆功能。我的1有一些错误消息,例如错误(165114):克隆()在java.lang.Object中具有受保护的访问有很好的理由避免使用
Object.clone()
。有关详细信息,请参阅。同意,通常有很好的理由避免使用它。这就是我建议使用“new copy command”的原因。我不确定他是否有权访问该类的源代码,因此我正试图利用他可能拥有的资源。@goh6319,您有权访问ScmTelphoneDetailsViewRowInmpl类的源代码吗?如果有,我认为您应该添加一个名为“copyOf”的新方法或者类似的东西。这样的方法可以创建STDVRI对象的新实例,然后在返回它之前用相同的字段加载它。“clone()受保护”错误意味着您的STDVRI类尚未实现clone(),并且该方法不适用于您(除非您可以自己实现它,或者只创建我在这里描述的新方法。@Teto,我有权访问ScmTelphoneDetailsViewRowInmpl类。这意味着我不能使用标准函数创建如上所示的新1。此方法无效:ScmTelephoneDetailsViewRowImpl temp=new ScmTelephoneDetailsViewRowImpl(电话\会计\详细信息\ 9)我错过了什么吗?@goh6319您是否添加了一个“复制构造函数”来制作深度复制?这就是
ScmTelephoneDetailsViewRowImpl(ScmTelephoneDetailsViewRowImpl其他)
应该是。请查看编辑。此方法需要1乘1分配。如果我的表有很多列,这将非常麻烦。无论如何,我仍然感谢你的建议。如果我找不到任何方法来执行复制粘贴功能。我将使用你的1。^^我决定用你的方式创建一个新的复制构造函数。刚才我面临一些错误问题是由于adf标准构造函数不支持自定义。您需要创建一个新的包和类来使其正常工作。
ScmTelephoneDetailsViewRowImpl temp = telphone_accounting_details_9.clone();
copy_set.add(temp);